我正在尝试格式化任意表达式,比如(+ 2 3)
,同时,结果是5
。
我有以下内容:
(defun expr-and-result (expr)
(format t "~a returns ~a~%" expr (eval expr)))
CL-USER> (expr-and-result '(+ 2 3))
(+ 2 3) returns 5
虽然使用eval
这是一件简单的事情,但我很好奇是否可以在没有它的情况下完成这个效果(因为我听到很多要避免使用eval)。
我理解引用该参数是必要的,因为否则将调用给定表达式作为调用expr-and-result
的第一步,并且只能在expr-and-result
内使用其结果。因此,任何可能的解决方案都需要引用输入,对吧?
我想了一下宏,但我觉得这是我正在寻找的错误方法。
编辑:我的目的是构建一个简单的测试套件,例如:
(progn
(mapcar #'expr-and-result
'((= (my-remainder 7 3) 1)
(= (my-remainder 7 3) 2)))
'end-of-tests)
Outputs:
(= (MY-REMAINDER 7 3) 1) returns T
(= (MY-REMAINDER 7 3) 2) returns NIL
END-OF-TESTS
在阅读了Paulo的评论后,似乎eval
是我目的最短,最干净的解决方案。