在没有eval的情况下格式化表达式及其结果

时间:2015-04-30 17:01:23

标签: common-lisp eval

我正在尝试格式化任意表达式,比如(+ 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是我目的最短,最干净的解决方案。

0 个答案:

没有答案