简单的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")

我应该如何发送参数请求?

Answers:


11

这是因为'(("address" . address))引用(即由前缀',这意味着里面有什么东西没有得到评估运营商)。该request功能因此被称为与是未计算的参数address 符号(而在你的第一次执行,该request函数获取一个字符串litteral,这并不需要先计算)。

您可以通过两种方式解决此问题:

1) 准引用参数,它使您能够获得几乎相同的行为,但可以指定仍需要评估的部分:

`(("address" . ,address))

请注意,单引号(')已由反引号(`)代替,并,在前面添加了特殊标记address以指示应对其进行求值并用其值替换。

2)(根据@JordonBiondo的评论)使用诸如或的原语显式构建该结构。在您的情况下,可以这样进行:listcons

(list (cons "address" address))

其中又"address"是一个字符串文字(对其自身求值),address由于它是函数调用中的参数而被求值。


感谢您的解释。它正在改善,但现在我得到“错误的类型参数:integerp,\,” :(
baol 2015年


1
我添加了指向手册相关部分的链接,以使其更加清晰。而且我也明确提到反引号,因为这是勿庸置疑不是很明显一见钟情...
弗朗索瓦Févotte

6
或者,您可以写成(list (cons "address" address))好像您不想使用反引号
Jordon Biondo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.