簡単な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")

リクエストにパラメーターを送信するにはどうすればよいですか?

回答:


11

これは、'(("address" . address))引用されている(つまり、'演算子が前に付いている)ためです。つまり、内部にあるものは評価されません。requestしたがって、関数は未評価のaddress シンボルである引数で呼び出されます(最初の実装では、request関数は文字列を取得しますが、最初に評価する必要はありません)。

これは2つの方法で修正できます。

1) 引数を準引用符で囲みます。これにより、ほとんど同じ動作を得ることができますが、評価する必要がある部分を指定できます。

`(("address" . ,address))

単一引用符(')が逆引用符()に置き換えられ、評価され、その値に置き換えられることを示すために、前に`特別なマーカー,が追加addressされたことに注意してください。

2)(@JordonBiondoのコメントに従って)またはなどのプリミティブを使用して明示的に構造を構築します。あなたの場合、これは次のように行われます:listcons

(list (cons "address" address))

ここでも、"address"文字列リテラル(それ自体が評価されます)でありaddress、関数呼び出しの引数なので評価されます。


説明ありがとう。それは改善しているが、今私が得る「間違った型引数:integerp、\、」:(
baol


1
わかりやすくするために、マニュアルの関連部分へのリンクを追加しました。そして、私はまた、明示的に...それは当然一見ことは明らかではなかったので、バッククォートを述べた
フランソワ・Févotte

6
あるいは、(list (cons "address" address))バッククォートを使いたくないかのように書くこともできます
Jordon Biondo
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.