Sử dụng request.el đơn giản


9

Câu hỏi dễ lúng túng của tôi là như sau:

Tại sao đoạn mã sau hoạt động:

(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)

Trong khi cái này thì không?

(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")

Làm thế nào tôi nên gửi một tham số để yêu cầu?

Câu trả lời:


11

Điều này là do '(("address" . address))được trích dẫn (tức là tiền tố của 'toán tử), có nghĩa là những gì bên trong không được đánh giá. Các requestchức năng như vậy được gọi với một cuộc tranh cãi đó là unevaluated address biểu tượng (trong khi trong thực hiện đầu tiên của bạn, requestchức năng nhận được một litteral chuỗi, mà không cần phải được đánh giá đầu tiên).

Bạn có thể sửa lỗi này theo 2 cách:

1) trích dẫn đối số, cho phép bạn có hầu hết các hành vi tương tự nhưng chỉ định các phần vẫn cần được đánh giá:

`(("address" . ,address))

Lưu ý rằng trích dẫn đơn ( ') đã được thay thế bằng backquote ( `) và một điểm đánh dấu đặc biệt ,đã được thêm vào trước đó addressđể chỉ ra rằng nó nên được đánh giá và thay thế bằng giá trị của nó.

2) (theo nhận xét của @ JordonBiondo) xây dựng cấu trúc một cách rõ ràng bằng cách sử dụng các nguyên thủy như listhoặc cons. Trong trường hợp của bạn, điều này sẽ được thực hiện như thế này:

(list (cons "address" address))

trong đó, một lần nữa, "address"là một chuỗi ký tự (tự đánh giá chính nó) và addressđược đánh giá vì nó là đối số trong một lệnh gọi hàm.


Cảm ơn đã giải thích. Nó đang được cải thiện, nhưng bây giờ tôi nhận được "Đối số loại sai: số nguyên, \," :(
baol


1
Tôi đã thêm các liên kết đến các phần có liên quan của hướng dẫn để làm cho nó rõ ràng hơn. Và tôi cũng đã đề cập rõ ràng đến backquote vì nó không có gì đáng ngạc nhiên ngay từ cái nhìn đầu tiên ...
François Févotte

6
cách khác, bạn có thể viết như (list (cons "address" address))thể bạn không muốn sử dụng backticks
Jordon Biondo
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.