評估變量我有以下功能(我在Lisp的一個非常初級):Lisp的宏表達
(defun my-fun (a b)
(my-commandsend-and-reply-macro (cmd)
(:reply (ok result)
(do-something a b result)))
)
在我的-commandsend - 迴應 - 宏是由另一個程序員編寫的宏。我無法修改它。
my-commandsend-and-reply-macro向服務器進程(使用另一種編程語言編寫)發送命令(在本例中爲cmd),然後等待其答案。 然後在宏中使用用戶給定的「:代碼的回覆部分」處理答案。列表(OK結果)是一種模式,在宏中,解構綁定破壞並且將合適的答案綁定到ok和result(ok只是一個標記)。在此之後,「:回覆部分」的其他用戶給出的行被執行。 (對於結果處理)
我想做到以下幾點:
1,發送命令等發送到其他進程(這是確定)
2,調用一個函數(如做某事)使用結果和使用一些其他參數,這是我的樂趣的實際參數(這部分失敗...)
我該怎麼做?我認爲問題是a和b在宏擴展之前沒有被評估,當宏被擴展時Lisp搜索本地a和b,但是沒有a或b。有什麼方法可以評估a和b嗎? (這樣的宏可以像對待具體的值)
這是宏觀DEF:(由另一個程序員寫的)
(defmacro* my-commandsend-and-reply-macro ((cmd &rest args) &body body)
`(progn
(with-request-id()
(setf (gethash *request-id* *my-callbacks*)
(lambda (status &rest status-args)
(case status
,@(loop for (kind . clause) in body when (eql kind :reply)
collect
(destructuring-bind
((status-flag &rest lambda-form-pattern)
&body action-given-by-user) clause
`(,status-flag
(destructuring-bind ,lambda-form-pattern status-args
,@action-given-by-user))))
((error)
(message "Error: %s" (elt (elt status-args 0) 1))))))
(apply #'send-command-to-process *request-id* cmd args)))))
防守與請求-ID:
(defmacro* with-request-id ((&rest vars) &body body)
"Send `getid' to the server, and call `body' once the response
with the new ID has arrived. By then, global variable `*request-id*'
is bound to the latest request ID."
`(progn
(when (not (server-is-running))
(error "Server isn't running!"))
(when *reqid-queue*
(error "Some internal error occured. Please, restart the program!"))
(lexical-let (,@(loop for var in vars
collect `(,var ,var)))
(setf *reqid-queue* (lambda()
(unwind-protect
(progn ,@body)
(setf *reqid-queue* nil)))))
(get-id)))
而且從另一個進程獲取ID:
(defun get-id()
(send-command-to-process 'getid))
你會更好地展示*宏(或其演示版本),而不僅僅是描述它。我真的不確定這是什麼意思:'發送像我這樣的命令(像做某事)n我的樂趣(這是好的)' – phils
我同意@phils。試着展示你到目前爲止所嘗試的 - 確切的代碼。說出它發生了什麼,以及你期望/想要發生什麼。 – Drew
正如我在我的問題中提到的,我嘗試使用「my-commandsend-and-reply-macro」和它的「:reply」部分來定義我自己的回調函數。在回調函數中,我需要使用一些變量(請參閱示例,如do-something中使用的變量「a」和「b」)。 發生了什麼:變量未被評估,並且Lisp表示沒有變量「a」或「b」(可能是動態作用域的原因),因爲它在宏擴展的位置搜索變量。 我想對此有一個解決方法。 – user1724641