Неспособность передать параметры функции, проанализированные из аргументов командной строки - PullRequest
3 голосов
/ 03 января 2011

У меня есть функция, которая использует 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.

Я новичок в Лиспе, поэтому я на 100% уверен, что упускаю что-то очень простое, чтобы сделать здесь параметры.Например, если я добавлю вызов format в функцию scrape, я увижу, что имя пользователя передается правильно.

Ответы [ 2 ]

2 голосов
/ 03 января 2011

Когда вы используете цитату для создания буквального списка, цитата распространяется вниз, чтобы запретить оценку всех членов списка.Вы можете увидеть, как username был получен в результате к моменту его распечатки, что является значением по умолчанию для чтения символов.

Вы должны создать структуру списка, используя формы LIST и CONS, если необходимо, или использоватьобратная цитата, которая позволяет выборочно оценивать произведения, например,

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

или

`(("username" . ,username)
  ("password" . ,password))
1 голос
/ 03 января 2011

Аргумент parameters для drakma:http-request заключен в кавычки, поэтому он не получает строки, которые вы передали в alist, он получает символы USERNAME и PASSWORD.Вы должны построить список таким образом, чтобы он включал переменные аргумента в контексте, в котором они оцениваются, например, (list (cons "username" username) (cons "password" password)).

...