【问题标题】:What is the difference between '(a b c) and (list 'a 'b 'c)?'(a b c) 和 (list 'a 'b 'c) 有什么区别?
【发布时间】:2010-11-27 21:14:24
【问题描述】:

我正在阅读“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)是一样的?有什么区别?

【问题讨论】:

    标签: lisp common-lisp sbcl


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 1970-01-01
        • 2012-07-03
        • 1970-01-01
        • 2020-04-02
        • 2013-06-25
        • 1970-01-01
        • 1970-01-01
        • 2020-10-09
        相关资源
        最近更新 更多