Lisp ';(a b c)和(列表a和b和c)?

Lisp ';(a b c)和(列表a和b和c)?,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,我正在阅读“OnLisp”,遇到了这段代码(我简化了一点) *到底是什么意思?它是上一个函数调用吗?它适合在真实世界的代码中使用吗 为什么(ncoc*'(de))更改第一个foo函数的返回值 我一直认为(列出'a'b'c)和(a b c)是一样的吗?有什么区别 每次评估时,对列表的调用都会创建一个新列表。编译后,列表文字可能会放在只读内存段中。然后,使用NCOC对列表进行破坏性更新是有问题的,可能会产生未定义的后果(分段错误、更改文字以供将来参考,或者什么都不做)。变量*、***和***由语言

我正在阅读“OnLisp”,遇到了这段代码(我简化了一点)

  • *
    到底是什么意思?它是上一个函数调用吗?它适合在真实世界的代码中使用吗

  • 为什么
    (ncoc*'(de))
    更改第一个
    foo
    函数的返回值

  • 我一直认为
    (列出'a'b'c)
    (a b c)
    是一样的吗?有什么区别


每次评估时,对列表的调用都会创建一个新列表。编译后,列表文字可能会放在只读内存段中。然后,使用NCOC对列表进行破坏性更新是有问题的,可能会产生未定义的后果(分段错误、更改文字以供将来参考,或者什么都不做)。

变量
*
***
***
由语言指定,在测试时非常有用。它们是REPL的一个特性,所以在“真实世界的代码”中不有用,也不应该有用

CL-USER> (defun foo ()                                                          
           '(a b c))
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C D E) 
CL-USER> (defun foo ()                                                          
          (list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN                                          
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C)