无法传递从命令行参数解析的函数参数

时间:2011-01-03 02:01:05

标签: parameters common-lisp

我有一个使用Drakma来获取网页的功能:

(defun scrape ()
  (let ((cookie-jar (make-instance 'drakma:cookie-jar)))
    (drakma:http-request "http://www.example.com/account/login"
             :method :post
             :parameters '(("username" . "myusername")
                       ("password" . "mypassword"))
             :cookie-jar cookie-jar)
    (setq body (drakma:http-request "http://www.example.com/"
                    :cookie-jar cookie-jar))
    (format t body)))

这正如我所料。但是,如果我像这样参数化用户名和密码:

(defun scrape (username password)
  (let ((cookie-jar (make-instance 'drakma:cookie-jar)))
    (drakma:http-request "http://www.example.com/account/login"
             :method :post
             :parameters '(("username" . username)
                       ("password" . password))
             :cookie-jar cookie-jar)
    (setq body (drakma:http-request "http://www.example.com/"
                    :cookie-jar cookie-jar))
    (format t body)))

...并像这样调用它:

(scrape "my_username" "my_password")

...然后我收到以下错误:

*** - Don't know what to do with name/value pair ("username" . USERNAME) in multipart/form-data body.

我是Lisp的新手,所以我100%肯定我在这里缺少一些非常简单的参数。例如。如果我向scrape函数添加格式调用,我可以看到用户名正在正确传递。

2 个答案:

答案 0 :(得分:2)

当您使用引号创建文字列表时,引号向下延伸以禁止评估列表的所有成员。您可以看到username在打印出来时是如何升级的,这是读取符号的默认值。

您必须根据需要使用LIST和CONS表单构建列表结构,或使用允许您有选择地评估片段的反引号,即

(list (cons "username" username)
      (cons "password" password))

`(("username" . ,username)
  ("password" . ,password))

答案 1 :(得分:1)

引用parameters的{​​{1}}参数,因此它没有获得您在alist中传递的字符串,而是获得符号drakma:http-requestUSERNAME。您需要以这样的方式构造列表,即它在包含它们的上下文中包含参数变量,例如: PASSWORD