小编Wu *_* Li的帖子

在宏中取消引用时未定义的变量

这是我的宏定义:

*(defmacro run-test (test)
   `(format t "Run test ~a ... ~a" ',test ,test))
*(run-test (= 1 1))
Run test (= 1 1) ... T
NIL
Run Code Online (Sandbox Code Playgroud)

一切都工作正常,所以我已经定义了第二个宏(运行多个测试):

*(defmacro run-tests (&body body) 
   `(loop for tc in ',body 
      do (run-test tc)))
* (run-tests (= 2 (1+ 1)) (= 1 1))
Run test TC ... (= 2 (1+ 1) Run test TC ... (= 1 1)
Run Code Online (Sandbox Code Playgroud)

这个结果不是我想要的,我希望每个值都tc被sexp替换,并且在运行测试中评估值.我试图更换线路

          do (run-test tc)
Run Code Online (Sandbox Code Playgroud)

          do (run-test ,tc)
Run Code Online (Sandbox Code Playgroud)

但这表示错误

未定义的变量:TC

如何更改以获得正确的结果?

lisp macros common-lisp

2
推荐指数
1
解决办法
192
查看次数

函数中的setf不起作用

我定义了一个特殊变量*unsorted-lst*和一个在我的脚本中重置此变量的函数:

(defparameter *unsorted-lst* nil)

(defun reset-to-unsorted-list ()
  (setf *unsorted-lst* '(1 3  0 22 3 1 3 299 31 5 0 3 7 96 24 44))
  (format t "after reset: ~a~%" *unsorted-lst*)
)
Run Code Online (Sandbox Code Playgroud)

之后我将它们复制到SBCL控制台进行测试,我做了:

* (setf *unsorted-lst* '(1 2 3))
(1 2 3)
* (reset-to-unsorted-list)
after reset: (1 3 0 22 3 1 3 299 31 5 0 3 7 96 24 44)
NIL
Run Code Online (Sandbox Code Playgroud)

到目前为止一切正常.然后我做了

* (setf (second *unsorted-lst*) 100)
100
* (reset-to-unsorted-list)
after reset: (1 100 0 22 3 1 …
Run Code Online (Sandbox Code Playgroud)

lisp common-lisp

1
推荐指数
1
解决办法
413
查看次数

标签 统计

common-lisp ×2

lisp ×2

macros ×1