2009-09-13 71 views
7

我在閱讀「On lisp」並遇到此代碼(我簡化了一下)。'(a b c)和(list'a'b'c)之間的區別是什麼?

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)是一樣的嗎?有什麼不同?

回答

14

對LIST的調用會在每次評估時創建一個新列表。列表文字可能在編譯後被放置在只讀內存段中。 NCONC對列表的破壞性更新是有問題的,可能帶來未定義的後果(分割錯誤,改變未來引用的文字,或根本沒有)。

+0

還沒有想到;) – 2009-09-13 09:33:41

8

變量******由語言standard指定,它們在測試時非常有用。它們是REPL的一個特徵,所以它們不適用於「真實世界的代碼」。

+0

+1用於HyperSpec參考 – sigjuice 2009-09-14 03:16:34

相關問題