7

我正在阅读“On lisp”并遇到了这段代码(我简化了一点)。

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)
  • 究竟是什么*意思?是之前的函数调用吗?它适合在现实世界的代码中使用吗?

  • 为什么会(nconc * '(D E))改变第一个foo函数的返回值?

  • 我一直以为(list 'a 'b 'c)'(a b c)都一样?有什么不同?

4

2 回答 2

14

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

于 2009-09-13T09:30:33.633 回答
8

Variables *, ** and *** are specified by the language standard and they are quite useful when testing things. They are a feature of the REPL, and so are not, and not supposed to, be useful in a "real world code".

于 2009-09-13T10:25:34.277 回答