5

Common Lisp では()、自己評価形式のようです。つまり、それ自体 (またはそのエイリアスnil) に評価されます。したがって、引用する必要はないように思われます。しかし、私の quicklisp ディレクトリで grep を使用すると'()、さまざまなプロジェクトのさまざまな人々によって書かれた の多数のインスタンスが見つかります。引用されたバージョンを書き出す技術的な理由はありますか? Common Lisp the Lanugage, 2nd Edition , Section 1.2.2()では、 で空リストを強調したり、 boolean false で強調したい文体の違いについて言及していますがnil、この質問については触れていません。スティールが使用する例の1つは次のとおりです。

(append '() '())

...次のように書くこともできると思います:

(append () ())

...では、なぜ余分なQUOTEsものをそこに投げ込むのですか? 確かに、それは物事を傷つけません。文体的には、どちらの形式が一般的に好まれますか? 誰かが確かに、気が変わった場合に要素を追加するのが簡単になり、代わりに空でないリテラルリストが本当に必要になると主張することができます。または、空でないリテラル リストでも引用符が必要になるため、引用符の使用に特定の対称性があること。

この歴史的な荷物は、伝統によって引き継がれてきた他の/古い関連言語からぶら下がっていますか?

これは、引用する必要があるSchemeとは異なります。また、elisp でそれを引用する必要はないように思われるので、もしかすると、それは lisp-1 と lisp-2 との関係で遠回りになるのでしょうか?

4

4 に答える 4

8

引用には非常に有益なプロパティがあり、トークンがリテラル データであると想定されていることを明確に示しています。あなたや同僚が数年後にコードを再訪するときはなおさらです。

パラメータリストやクラスのスーパークラスやスロットなど、評価されていない形式で空のリストを宣言するには、(引用符なしで) を使用する必要があります()。引用符が実際に害を及ぼす場合。実際には、nil同様に使用できますが、明確にするために、宣言されたものがリストの場合は使用しないでください。


仕様からの関連する抜粋を次に示します。

1.4.1.4.4 なし

nilいろいろな意味があります。COMMON-LISPという名前のパッケージ内のシンボルであり、"NIL"ブール値 (および一般化されたブール値) の false であり、空のリストであり、空の型 (すべての型のサブタイプ) の名前です。

Common Lisp 内では、またはnilとして区別なく表記できます。慣例により、記法の選択は、それが果たしている多くの役割のヒントを提供します。NIL()

For Evaluation?  Notation  Typically Implied Role       
----------
Yes              nil       use as a boolean.            
Yes              'nil      use as a symbol.             
Yes              '()       use as an empty list         
No               nil       use as a symbol or boolean.  
No               ()        use as an empty list.        

図 1-1。NILの表記

このドキュメント内でのみ、nilブール値としての役割を強調するために false と表記されることもあります。

例えば:

(print ())                          ;avoided
(defun three nil 3)                 ;avoided 
'(nil nil)                          ;list of two symbols
'(() ())                            ;list of empty lists
(defun three () 3)                  ;Emphasize empty parameter list.
(append '() '()) =>  ()              ;Emphasize use of empty lists
(not nil) =>  true                   ;Emphasize use as Boolean false
(get 'nil 'color)                   ;Emphasize use as a symbol

関数は、状況によっては「偽である」または「真である」と言われることがあります。同じ関数オブジェクトはあり得ずnil、すべての関数オブジェクトはブール値として見たときに true を表すため、その関数が文字通り false であったと言っても意味がなく、文字通り true であったと言っても意味がありません。代わりに、これらのフレーズは、関数がそれぞれ「false を返す」または「true を返す」と言う従来の代替方法にすぎません。

于 2016-05-25T10:54:59.363 に答える
4

自己評価であっ'()()も、書くことを好む理由があります。()評価されたフォームではなく、データムを扱っていることが視覚的に明らかであるため、コードが読みやすくなります。

'#(foo bar baz (+ 1 2))への書き込みを好む理由と同様#(foo bar baz (+ 1 2))です。fooどちらも同じものとして評価されますが、前者では、 、barbaz、および(+ 1 2)内が評価されないことが視覚的に明らかになります。

于 2016-05-25T00:01:42.757 に答える
3

NIL()またはを引用することはTありません。もちろん、数字や文字列も引用しません。

私が誰かのコードを読んだ場合'()、私は作者の意図とおそらくCommon Lispでの引用についての彼/彼女の理解について混乱する可能性があります(ここでの初心者の質問は引用との混乱を示す傾向があります)。

CL の実装によっては、ある時点で を引用する必要があった可能性については語れませんが()、作者が他の種類の Lisp の経験があり、この経験を Common Lisp に適用しようとしている可能性が高くなります。習慣で、ま​​たは意図的に。

引用することが理にかなっていると私が思う唯一のケース()は、以前は空でなかった定数リストが空になり、誰かがわざわざ引用を削除しなかった場合です。

(defvar *options* '(debug))

…となる

(defvar *options* '())

後でデフォルトを変更する予定がある場合に備えて、引用符を保持することも理にかなっています.

于 2016-05-25T07:43:19.760 に答える