Просте запит.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чином, функція викликається аргументом, який є неоціненим address символом (тоді як у вашій першій реалізації requestфункція отримує рядковий літтерал, який не потрібно оцінювати спочатку).

Виправити це можна двома способами:

1) квазіцитування аргументу, що дозволяє отримати переважно таку саму поведінку, але вказати частини, які ще потрібно оцінити:

`(("address" . ,address))

Зауважте, що одинарна 'лапка ( `) була замінена зворотним котируванням ( ), а ,перед цим було додано спеціальний маркер, addressякий вказує на те, що її слід оцінювати та замінювати її значенням.

2) (відповідно до коментаря @ JordonBiondo) побудова структури явно за допомогою примітивів, таких як listабо cons. У вашому випадку це робиться так:

(list (cons "address" address))

де, знову ж таки, "address"є рядковим літералом (який оцінює сам) і addressотримує оцінку, оскільки це аргумент у виклику функції.


Дякую за пояснення. Він вдосконалюється, але тепер я отримую "Аргумент неправильного типу: integerp, \," :(
baol

Ага, добре: gnu.org/software/emacs/manual/html_node/elisp/Quoting.html - це зворотне цитування !!
baol

1
Я додав посилання на відповідні частини посібника, щоб зробити його більш зрозумілим. І я також чітко згадав про зворотній цитат, оскільки це на перший погляд не дивно було не таким очевидним ...
Франсуа Февотте

6
Як варіант, ви можете написати це, як (list (cons "address" address))ніби не хочете використовувати зворотні посилання
Jordon Biondo
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.