質問

「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)は同じだといつも思っていましたか?違いは何ですか?

役に立ちましたか?

解決

LISTの呼び出しは、評価されるたびに新しいリストを作成します。リストリテラルは、コンパイル後に読み取り専用メモリセグメントに配置される場合があります。 NCONCを使用したリストの破壊的な更新は、おそらく未定義の結果(セグメンテーションエラー、将来の参照用のリテラルの変更、またはまったくなし)を伴う問題があります。

他のヒント

変数 * ** および *** は、言語標準であり、テストの際に非常に役立ちます。これらはREPLの機能であるため、「実世界のコード」では有用ではありませんし、そうなることも想定されていません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top