Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Common lisp 关于commonlisp中的函数eval_Common Lisp - Fatal编程技术网

Common lisp 关于commonlisp中的函数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的行为是这样的吗

(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)。非常感谢,不用了。我只是在学习和好奇。我只是在学习和好奇。哇,这真的让我大开眼界。非常感谢。哇,这真的让我大开眼界。非常感谢你。