Common lisp 关于commonlisp中的函数eval
有人能解释一下为什么函数eval的行为是这样的吗Common lisp 关于commonlisp中的函数eval,common-lisp,Common Lisp,有人能解释一下为什么函数eval的行为是这样的吗 (eval (list 'cons t nil)) returns (T) (eval (list 'cons 'a nil)) causes an error (eval (list 'cons ''a nil)) returns (A) 非常感谢。首先: (CONS T NIL) T是一个常数,计算时返回T。NIL也是一个常数,计算结果为NIL。(CONS T NIL)然后返回(T.NIL),该值较短,写为(T) 第二: (CONS
(eval (list 'cons t nil)) returns (T)
(eval (list 'cons 'a nil)) causes an error
(eval (list 'cons ''a nil)) returns (A)
非常感谢。首先:
(CONS T NIL)
T是一个常数,计算时返回T。NIL也是一个常数,计算结果为NIL。(CONS T NIL)然后返回(T.NIL),该值较短,写为(T)
第二:
(CONS A NIL)
A是一个变量。它可能是未定义的。当未定义时,对其求值将导致错误
第三:
现在,您应该首先考虑第三种形式…:
(CONS T NIL)
T是一个常数,计算时返回T。NIL也是一个常数,计算结果为NIL。(CONS T NIL)然后返回(T.NIL),该值较短,写为(T)
第二:
(CONS A NIL)
A是一个变量。它可能是未定义的。当未定义时,对其求值将导致错误
第三:
现在您应该考虑第三种形式…您可能需要注意的另一件事是,第三种形式将符号A嵌入列表中。通常,这是Lisp书籍中主要教授的形式,通过在REPL上进行实验来学习。然而,在实际的程序/函数中,您可能会在开始时更多地将A表示的值或列表放在列表中,而不是符号A e、 g。 (setf a 2) (eval(列表‘cons a nil’)=>(2)[在评估列表之前评估a;(eval’(cons 2 nil))] (eval(列出‘cons’a nil))=>(2)[评估(eval’(cons a nil))时评估a] (eval(list'cons'a nil))=>(a)[a不会被评估为调用is(eval'(cons'a nil));'a是符号a]
如果您在开始时没有执行(setf a 2),则第一个和第二个表单都将给出错误。这是因为当计算a时,它没有边界(即粗略地说,它没有任何与之关联的值)您可能需要注意的另一件事是,第三种形式是将符号a嵌入列表中。通常,这是Lisp书籍中主要教授的形式,通过在REPL上进行实验来学习。然而,在实际的程序/函数中,您可能会在开始时更多地将A表示的值或列表放在列表中,而不是符号A e、 g。 (setf a 2) (eval(列表‘cons a nil’)=>(2)[在评估列表之前评估a;(eval’(cons 2 nil))] (eval(列出‘cons’a nil))=>(2)[评估(eval’(cons a nil))时评估a] (eval(list'cons'a nil))=>(a)[a不会被评估为调用is(eval'(cons'a nil));'a是符号a]
如果您在开始时没有执行(setf a 2),则第一个和第二个表单都将给出错误。这是因为当计算a时,它没有边界(即粗略地说,它没有任何与之关联的值)得到了它。返回(A)的是(CONS’A NIL)。非常感谢,明白了。返回(A)的是(CONS’A NIL)。非常感谢,不用了。我只是在学习和好奇。我只是在学习和好奇。哇,这真的让我大开眼界。非常感谢。哇,这真的让我大开眼界。非常感谢你。