unofficial mirror of help-gnu-emacs@gnu.org
 help / color / mirror / Atom feed
* How to use a variable from outer scope in the success function of a request call?
@ 2015-08-29  0:36 Iñigo Serna
  0 siblings, 0 replies; 7+ messages in thread
From: Iñigo Serna @ 2015-08-29  0:36 UTC (permalink / raw)
  To: help-gnu-emacs

Hi,

; I can't use a variable inside the success lambda function of a web request call.
; As this is difficult to explain I'll show some things I've tried.

(require 'request)
(fnX "TEXT") ; this is the function call.

; In `fn1' execution fails because the c variable in the message calls is not found inside the success function scope.
(defun fn1 (c)
  (request "https://api.stackexchange.com/2.1/questions"
           :params '((order . "desc")
                     (sort . "activity")
                     (site . "stackoverflow"))
           :parser 'json-read
           :success (function*
                     (lambda (&key data &allow-other-keys)
                       (let* ((item (elt (assoc-default 'items data) 0))
                              (title (assoc-default 'title item))
                              (tags (assoc-default 'tags item)))
                         (message "PARAMS: %s" c)
                         (message "=> %s %S" title tags)
                         (message "LAST: %s" c))))))

; In `fn2' I've added c as parameter for lambda function, but I don't know how to pass the external c variable to the lambda function. Now it doesn't fail, but it shows nil.
(defun fn2 (c)
  (request "https://api.stackexchange.com/2.1/questions"
           :params '((order . "desc")
                     (sort . "activity")
                     (site . "stackoverflow"))
           :parser 'json-read
           :success (function*
                     (lambda (&key data c &allow-other-keys)
                       (let* ((item (elt (assoc-default 'items data) 0))
                              (title (assoc-default 'title item))
                              (tags (assoc-default 'tags item)))
                         (message "PARAMS: %s" c)
                         (message "=> %s %S" title tags)
                         (message "LAST: %s" c))))))

; So I'm trying to use defmacros to pass the variable.
(defmacro my-request2 (url func &optional more)
  "Call REQUEST URL and execute FUNC on success."
  `(request ,url
            :params '((order . "desc")
                      (sort . "activity")
                      (site . "stackoverflow"))
            :parser 'json-read
            :success (function* (lambda (&key data &allow-other-keys) (funcall ,func data ,more)))))

 ; Here, `fn3' does not crash but it shows c as symbol 'c', not the contents of c variable.
(defun fn3 (c)
  (my-request2 "https://api.stackexchange.com/2.1/questions"
               #'(lambda (data &optional d)
                   (let* ((item (elt (assoc-default 'items data) 0))
                          (title (assoc-default 'title item))
                          (tags (assoc-default 'tags item)))
                     (message "PARAMS: %S" d)
                     (message "=> %s %S" title tags)
                     (message "LAST: %S" (nth 2 d))))
               '("OOOO" "AAAA" c)))

; `fn4' directly fails, and don't know why. I expect this alternative to work.
(defun fn4 (c)
  (my-request2 "https://api.stackexchange.com/2.1/questions"
               #'(lambda (data &optional d)
                   (let* ((item (elt (assoc-default 'items data) 0))
                          (title (assoc-default 'title item))
                          (tags (assoc-default 'tags item)))
                     (message "PARAMS: %S" d)
                     (message "=> %s %S" title tags)
                     (message "LAST: %S" (nth 2 d))))
               (list "OOOO" "AAAA" c)))

; Finally, `fn5' works, but this adds a second defmacro
(defmacro fn5 (c)
  `(my-request2 "https://api.stackexchange.com/2.1/questions"
                #'(lambda (data &optional d)
                    (let* ((item (elt (assoc-default 'items data) 0))
                           (title (assoc-default 'title item))
                           (tags (assoc-default 'tags item)))
                      (message "PARAMS: %S" d)
                      (message "=> %s %S" title tags)
                      (message "LAST: %S" (nth 2 d))))
                '("OOOO" "AAAA" ,c)))

(fn5 "TEXT")

; Is there any simpler way I'm missing? Why `fn4' does not work?


Thanks,
-- 
Iñigo Serna



^ permalink raw reply	[flat|nested] 7+ messages in thread
[parent not found: <mailman.118.1440827512.19560.help-gnu-emacs@gnu.org>]

end of thread, other threads:[~2015-08-29 22:24 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-08-29  0:36 How to use a variable from outer scope in the success function of a request call? Iñigo Serna
     [not found] <mailman.118.1440827512.19560.help-gnu-emacs@gnu.org>
2015-08-29  7:51 ` Pascal J. Bourguignon
2015-08-29  8:34   ` Iñigo Serna
2015-08-29  9:11     ` Iñigo Serna
     [not found]   ` <mailman.126.1440837274.19560.help-gnu-emacs@gnu.org>
2015-08-29 10:31     ` Pascal J. Bourguignon
2015-08-29 22:24       ` Iñigo Serna
2015-08-29 22:01   ` Stefan Monnier

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).