mit-schemeのnull値表現とは何か教えてもらえますか?SICPブックでは、「nil」である必要がありますが、機能しません。ありがとう。
4 に答える
'()
動作するはずです。基本的に、スキームのnilは空のリストであるため、空のリストを引用するとnilになります。
歴史があります。http://web.archive.org/web/20070808004043/http://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestionsにアクセスします
オリジナル(壊れた):http ://wiki.wordaligned.org/sicp/published/FrequentlyAskedQuestions
上記のFAQからのテキスト(インターネットアーカイブが破損した場合):
「nil」が機能しないのはなぜですか?
簡単な答えは次のとおりです。nilはSchemeの一部ではなくなり、'()
代わりに使用してください。長い答えは次のとおりです…</p>
第2章の初期の例ではnil
、リストターミネータとして使用されていますが、これらの例を(たとえば)MITスキームを使用して実行すると、次のようになります。
;Unbound variable: nil
同様に、()
またはnull
の代わりに使用nil
することは、一部の実装で機能する可能性がありますが、どちらも移植性がありません。ウィザードブックは、この脚注の問題に対処しています
Lisp方言の標準化におけるどれほどのエネルギーが、文字通り何もない議論に散逸していることは注目に値します。nilは普通の名前である必要がありますか?nilの値はシンボルである必要がありますか?それはリストであるべきですか?ペアにする必要がありますか?スキームでは、nilは通常の名前であり、このセクションでは、値がリストの終わりマーカーである変数として使用します(trueがtrue値を持つ通常の変数であるのと同じです)。Common Lispを含むLispの他の方言は、nilを特別な記号として扱います。あまりにも多くの言語標準化の乱闘に耐えてきたこの本の著者は、問題全体を避けたいと思っています。セクション2.3で引用符を導入したら、空のリストを'()と表記し、変数nilを完全に省略します。
これが書かれて以来、nilはScheme標準から削除されましたが、結論は次のようになります。nilではなく'()を使用します。accu-sicpリストへの電子メールで、マイクは次のように述べています。
これは厄介なことです、このnil / null /'()ビジネス。Scheme48とscmはnullを定義せず、guileはそれを定義しますが、一般的なlispのnullに似たプロシージャとして(clのnilのように動作するnilを使用するため、それ自体は'()とは異なります。これはおそらくこれと関係があります。 guileでemacsをやり直すfsfの計画)。最善の策は、作者によるnilの使用を'()に置き換えることだと思います。
[マークダウンと通常のASCII入力を問題の言語/実装にさらに一致させるために、わずかな誤植のクリーンアップでコピーされました。]
私は使用しMIT/GNU Scheme microcode 15.3
、すべての作品。(あなたが言ったように、そして動作しません)。()
'()
nil
null
1 ]=> ()
;Value: ()
1 ]=> '()
;Value: ()
1 ]=> (cons 1 ())
;Value 2: (1)
1 ]=> (cons 1 '())
;Value 3: (1)
(list)'()および()はnullを表すことができます。例えば、
(define (transpose mat) (accumulate-n cons () mat))
または、()を'()または(list)に置き換えます。