การใช้งาน 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ฟังก์ชั่นจึงได้รับการเรียกว่ามีข้อโต้แย้งซึ่งเป็น unevaluated address สัญลักษณ์ (ในขณะที่ดำเนินการครั้งแรกของคุณrequestฟังก์ชั่นได้รับ litteral สตริงซึ่งไม่จำเป็นต้องได้รับการประเมินครั้งแรก)

คุณสามารถแก้ไขได้ 2 วิธี:

1) ข้อโต้แย้งกึ่ง quotingซึ่งช่วยให้คุณได้รับส่วนใหญ่พฤติกรรมเดียวกัน แต่เพื่อระบุชิ้นส่วนที่ยังคงต้องได้รับการประเมิน:

`(("address" . ,address))

โปรดทราบว่าเครื่องหมายคำพูดเดี่ยว ( ') ถูกแทนที่ด้วย backquote ( `) และ,เพิ่มเครื่องหมายพิเศษก่อนaddressเพื่อระบุว่าควรได้รับการประเมินและทดแทนด้วยค่าของมัน

2) (ตาม @ ความคิดเห็นของ JordonBiondo) การสร้างโครงสร้างอย่างชัดเจนโดยใช้พื้นฐานเช่นหรือlist consในกรณีของคุณสิ่งนี้จะเป็นดังนี้:

(list (cons "address" address))

โดยที่อีกครั้ง"address"เป็นสตริงตัวอักษร (ซึ่งประเมินค่ากับตัวเอง) และaddressได้รับการประเมินเนื่องจากเป็นอาร์กิวเมนต์ในการเรียกใช้ฟังก์ชัน


ขอบคุณสำหรับคำอธิบาย มันกำลังปรับปรุง แต่ตอนนี้ฉันได้รับ "อาร์กิวเมนต์ประเภทที่ไม่ถูกต้อง: จำนวนเต็ม, \," :(
baol

อ่าโอเค: gnu.org/software/emacs/manual/html_node/elisp/Quoting.htmlนั่นคือ backquote !!
baol

1
ฉันเพิ่มลิงก์ไปยังส่วนที่เกี่ยวข้องของคู่มือเพื่อให้ชัดเจนยิ่งขึ้น และฉันยังกล่าวถึง backquote อย่างชัดเจนเพราะมันไม่แปลกใจที่เห็นได้ชัดตั้งแต่แรกเห็น ...
FrançoisFévotte

6
ฉะนั้นคุณจะเขียนว่า(list (cons "address" address))ถ้าคุณไม่ต้องการที่จะใช้ backticks
Jordon Biondo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.