'(a b c)と(list' a 'b' c)の違いは何ですか?
-
07-07-2019 - |
質問
「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の機能であるため、「実世界のコード」では有用ではありませんし、そうなることも想定されていません。
所属していません StackOverflow