【发布时间】:2014-11-07 00:14:27
【问题描述】:
Lisp 经常声明某些类型是自我评估的。例如。在 emacs-lisp 数字中,"strings"、:keyword-symbols 和其他一些对自己进行评估。
或者,更具体地说:评估表单并再次评估结果会得到相同的结果。
也可以创建自定义的自我评估表格,例如
(defun my-list (&rest args)
(cons 'my-list (mapcar (lambda (e) (list 'quote e)) args)))
(my-list (+ 1 1) 'hello)
=> (my-list '2 'hello)
(eval (my-list (+ 1 1) 'hello))
=> (my-list '2 'hello)
定义这种形式是否有任何实际用途,或者这更像是一个深奥的概念?
我想将“自定义类型”创建为自我评估表单,例如,评估可以对参数执行类型检查。当尝试在我的代码中使用这些类型时,我通常发现它与简单的工作相比不方便,例如虽然有 plist。
*edit* 我又查了一下,好像把“自我评价”和“自我引用”搞混了。 In emacs lisp the later term was applied to the lambda form,至少在没有词法绑定的上下文中。请注意,即使结果是 equal,lambda 形式永远不会对自身求值 (eq)。
(setq form '(lambda () 1)) ;; => (lambda () 1)
(equal form (eval form)) ;; => t
(equal (eval form) (eval (eval form))) ;; => t
(eq form (eval form)) ;; => nil
(eq (eval form) (eval (eval form))) ;; => nil
正如 Joshua 在他的回答中所说:eval 函数的定点(相对于 equal)。
【问题讨论】: