간단한 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")

요청하기 위해 매개 변수를 보내려면 어떻게해야합니까?

답변:


12

그 이유 '(("address" . address))인용 부호가 붙어 있기 때문에 (즉, '연산자로 접두사를 붙임 ) 내부에있는 것이 평가되지 않음을 의미합니다. 따라서 request함수는 평가되지 않은 address 기호 인 인수와 함께 호출됩니다 (첫 번째 구현에서 request함수는 문자열 리터럴을 가져 오므로 먼저 평가할 필요는 없습니다).

이 두 가지 방법으로이 문제를 해결할 수 있습니다.

1) 인수를 유사 인용 하여 대부분 동일한 동작을 얻을 수 있지만 여전히 평가해야 할 부분을 지정할 수 있습니다.

`(("address" . ,address))

작은 따옴표 ( ')는 백 따옴표 ( )로 대체되었으며 `, 특수 마커 ,가 추가 address되어 평가되고 값으로 대체되어야 함을 나타냅니다.

2) () JordonBiondo의 코멘트 @ 따라 구조 구축 과 같은 명시 적으로 프리미티브를 사용하여 listcons. 귀하의 경우 다음과 같이 수행됩니다.

(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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.