Basit istek. Kullanım


9

Utanç verici derecede kolay sorum şu:

Aşağıdaki kod neden çalışır:

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

Bu olmasa da?

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

İstek için nasıl parametre gönderebilirim?

Yanıtlar:


12

Bunun nedeni ise '(("address" . address))bir alıntı (yani önek 'içinde ne olduğunu değerlendirilir almaz demek olduğunu, operatör). Bu requestnedenle işlev değerlendirilmemiş address sembol olan bir argümanla çağrılır (ilk uygulamanızda ise requestişlev, ilk olarak değerlendirilmesi gerekmeyen bir string litteral alır).

Bunu 2 şekilde düzeltebilirsiniz:

1) çoğunlukla aynı davranışı elde etmenizi ancak yine de değerlendirilmesi gereken kısımları belirtmenizi sağlayan argümanı yarı-alıntılama :

`(("address" . ,address))

Tek 'tırnak `işareti ( ) yerine bir backquote ( ) kullanılmıştır ve değerlendirilmesinin ve değeri ile değiştirilmesi gerektiğini belirtmek için daha ,önce özel bir işaretleyici eklendi address.

2) (@ JordonBiondo'nun yorumuna göre) veya gibi temel öğeleri kullanarak yapıyı açıkça oluşturmak . Sizin durumunuzda, bu şu şekilde yapılır:listcons

(list (cons "address" address))

burada yine "address"bir dize değişmez değeri (kendi kendini değerlendirir) ve addressbir işlev çağrısındaki argüman olduğu için değerlendirilir.


Açıklama için teşekkürler.
İyileşiyor


1
Daha anlaşılır olması için kılavuzun ilgili kısımlarına bağlantılar ekledim. Ayrıca, ilk bakışta şaşırtıcı derecede açık olmadığı için
arka alıntıdan

6
alternatif olarak (list (cons "address" address))backticks kullanmak istemiyormuş gibi yazabilirsiniz
Jordon Biondo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.