2009-09-13 24 views
7

私は "On lisp"を読んでいて、このコードを見つけました(少し単純化しました)。'(a b c)と(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

これは考えていませんでした;) –

8

変数*,**および***は、言語で指定されており、テスト時には非常に便利です。これらはREPLの機能であり、「実世界のコード」では有用ではなく、そうでないと思われます。

+0

+1 HyperSpecリファレンス – sigjuice

関連する問題