Little Schemerは、ますます長いリストに対して機能する関数を構築しています。長さ≤0のポイントの一部は、長さがゼロ以下のリストに対してのみ機能することです (負の長さのリストは存在しないため、これは長さがゼロのリストを意味します)。あなたが意図的に示したコードは、長さがゼロのリストに対してのみ機能します。実際、これは165 ページのテキストでも指摘されています。
A:この時点で、 mk-lengthから永遠への別のアプリケーションを作成できたらどうでしょうか?
B:それは問題を 1 つに先延ばしするだけです。
A:まあ、 mk-lengthに渡す関数を誰も気にしないので、最初にmk- lengthを渡すことができます。
B:それは正しい考えです。そして、mk-lengthをeternityで呼び出し、その結果をcdrで呼び出して、タワーのピースをもう 1 つ取得します。
A: では、これはまだ長さ0です。
((lambda (mk-length)
(mk-length mk-length))
(lambda (length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(length (cdr l))))))))
B:はい、 lengthの代わりにmk-lengthを使用することもできます:
((lambda (mk-length)
(mk-length mk-length))
(lambda (mk-length)
(lambda (l)
(cond
((null? l) 0)
(else (add1
(mk-length (cdr l))))))))
A:なぜそれをしたいのですか?
B:すべての名前は同じですが、ある名前は他の名前よりも同じです。
A:確かに: 名前を一貫して使用している限り、問題はありません。
B:そしてmk-lengthはlengthよりもはるかに等しい名前です。mk-lengthのような名前を使用すると、 mk-length の最初の引数がmk-lengthであることを常に思い出させます。
166 ページで、著者は、長さ 0 または 1 (つまり、≤1) のリストで機能するバージョンを示しています。最後に、167 ページで、任意の長さのリストで機能するバージョンに到達します。それがどのように機能するかは、別の質問で詳しく説明されています。
また、次のような興味深い質問が見つかるかもしれません。