我有一個替代符號的所有實例列表功能:如何通過引用SEXP宏觀
(defun replace-symbol-in-sexp-fn (symbol-to-replace new-symbol sexp)
(if (eq sexp nil)
sexp
(cons
(if (listp (car sexp))
(replace-symbol-in-sexp-fn symbol-to-replace new-symbol (car sexp))
(if (eq (car sexp) symbol-to-replace)
(setf (car sexp) new-symbol)
(car sexp)))
(replace-symbol-in-sexp-fn symbol-to-replace new-symbol (cdr sexp)))))
(defmacro replace-symbol-in-sexp (symbol-to-replace new-symbol sexp)
`(replace-symbol-in-sexp-fn ,symbol-to-replace ,new-symbol ,sexp))
(macroexpand-1 (replace-symbol-in-sexp '+ '* (+ 2 3)))
; => TYPE-ERROR "The value 5 is not of type LIST" if sexp has comma,
; => UNBOUND-VARIABLE "The variable SEXP is unbound" if sexp has no comma
我得到任何一個類型的錯誤或試圖評估時未定義變量錯誤最後的表達,取決於sexp是否在最後一行中是否逗號。我測試過並更換符號功能於SEXP-FN工作給予時說:
(replace-symbol-in-sexp-fn '+ '* '(+ 2 3)) ; => (* 2 3)
我想現在宏產生這樣使得SEXP沒有被引用像'(+ 2 3)
,所以我可以用任意的lisp代碼運行replace-symbol-in-sexp-fn。很顯然,我可以評估和傳遞引用到SEXP替代符號功能於SEXP-FN,如:
(eval (replace-symbol-in-sexp-fn '+ '* '(+ 2 3))
但是,這是一個笨拙的嘗試模仿宏,所以我寧願實際上只使用一個宏。有沒有一種乾淨的方式來做我想用宏做的事情?我錯過了什麼?
「我得到一個類型錯誤或未定義變量錯誤」我沒有看到這些問題中的任何一個。你能舉一個例子嗎? – 2014-11-24 03:23:24
用精確的結果進行編輯。 – cosmicexplorer 2014-11-25 13:04:21