सरल request.el उपयोग


9

मेरा शर्मनाक आसान सवाल निम्नलिखित है:

निम्न कोड क्यों काम करता है:

(require 'request)

(defun geocoder ()
  (request
   "http://rpc.geocoder.us/service/csv"
   ;;; **Hardcoded parameter!**
   :params '(("address" . "1600 Pennsylvania Ave, Washington DC"))
   :parser 'buffer-string
   :success (function*
             (lambda (&key data &allow-other-keys)
                (when data
                (with-current-buffer (get-buffer-create "*request demo*")
                  (erase-buffer)
                  (insert data)
                  (pop-to-buffer (current-buffer))))))
   :error
   (function* (lambda (&key error-thrown &allow-other-keys&rest _)
                (message "Got error: %S" error-thrown)))
   ))

(geocoder)

जबकि यह एक नहीं है?

(require 'request)

(defun geocoder (address) ;; adding a parameter!
  (request
   "http://rpc.geocoder.us/service/csv"
   :params '(("address" . address))
   :parser 'buffer-string
   :success (function*
             (lambda (&key data &allow-other-keys)
                (when data
                (with-current-buffer (get-buffer-create "*request demo*")
                  (erase-buffer)
                  (insert data)
                  (pop-to-buffer (current-buffer))))))
   :error
   (function* (lambda (&key error-thrown &allow-other-keys&rest _)
                (message "Got error: %S" error-thrown)))
   ))

;;; Now with parameter!
(geocoder "1600 Pennsylvania Ave, Washington DC")

मुझे अनुरोध करने के लिए एक पैरामीटर कैसे भेजना चाहिए?

जवाबों:


12

इसका कारण यह है है '(("address" . address))है उद्धृत (यानी लगाया जाता है ', जिसका अर्थ है कि अंदर क्या है का मूल्यांकन नहीं हो ऑपरेटर)। इस requestप्रकार फ़ंक्शन को एक तर्क के साथ बुलाया जाता है जो कि अविकसित address प्रतीक है (जबकि आपके पहले कार्यान्वयन में, requestफ़ंक्शन को एक स्ट्रिंग लिटरल मिलता है, जिसे पहले मूल्यांकन करने की आवश्यकता नहीं होती है)।

आप इसे 2 तरीकों से ठीक कर सकते हैं:

1) तर्क को उद्धृत करते हुए, जो आपको अधिकतर समान व्यवहार प्राप्त करने की अनुमति देता है लेकिन उन भागों को निर्दिष्ट करने के लिए जिन्हें अभी भी मूल्यांकन करने की आवश्यकता है:

`(("address" . ,address))

ध्यान दें कि एकल उद्धरण ( ') को बैकवॉट ( `) से बदल दिया गया है , और यह दर्शाने के लिए एक विशेष मार्कर ,जोड़ा addressगया है कि इसका मूल्यांकन किया जाना चाहिए और इसके मूल्य के साथ प्रतिस्थापित किया जाना चाहिए।

2) (प्रति @ JordonBiondo की टिप्पणी) के रूप में संरचना का निर्माण इस तरह के रूप में स्पष्ट रूप पुरातन का उपयोग कर listया cons। आपके मामले में, यह इस तरह किया जाएगा:

(list (cons "address" address))

जहां, फिर से, "address"एक स्ट्रिंग शाब्दिक (जो स्वयं का मूल्यांकन करता है), और addressमूल्यांकन किया जाता है क्योंकि यह फ़ंक्शन कॉल में तर्क है।


स्पष्टीकरण के लिए धन्यवाद। इसमें सुधार हो रहा है, लेकिन अब मुझे "गलत प्रकार का तर्क: पूर्णांक, \" मिला :(
baol


1
मैंने इसे स्पष्ट करने के लिए मैनुअल के प्रासंगिक भागों से लिंक जोड़े। और मैंने स्पष्ट रूप से बैककाउट का उल्लेख किया क्योंकि यह पहली नजर में स्पष्ट नहीं था ...
फ्रांकोइस फेवोते

6
वैकल्पिक रूप से आप यह लिख सकते हैं कि जैसे (list (cons "address" address))आप backticks का उपयोग नहीं करना चाहते
यर्डन बियोन्डो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.