drracket r5rs 言語でfoldやreduceなどの srfi/1 関数を使用しようとすると、常に null リストが表示されますか? エラー。いくつかの調査の結果、関数が不変リストを必要とするが、可変リストを取得するという事実によることがわかりました。r5rs で不変リストを作成するにはどうすればよいですか、またはこの srfi/1 は r5rs を念頭に置いて設計されていませんか?
2 に答える
これは基本的にジョンが言ったことを繰り返していますが、それは間違いなく完全な答えのステータスに値します。(ジョン、この回答を逐語的にコピーすれば、これを削除させていただきます...)
RacketのR5RS言語についてのことは、R5RS言語だけに非常に厳密に準拠しているため、それ以上のものは何も付属していないということです。(SRFIはR5RS可変ペアにも実装できますが、適応されたコードを思いついた人は誰もいませんでした。)
いずれにせよ、ここでの結論は、R5RSは基本的に、基本的なr5rs言語だけを使用して書くことの苦痛を自分自身に負わせたいというまれなケースでのみ役立つということです。つまり、基本的にあまり有用なことはできません。 。したがって、特に言語の感触を知りたい場合は、狭いr5rsの世界を超えたあらゆる種類のもので遊んでみたいと思うでしょう。そのためには、を使用する必要があります#lang racket
。
また、「言語を理解するだけ」という点でも優れており、他のScheme実装にも同じレッスンを適用できますが、すべて独自の拡張機能が付属していることを念頭に置いてください。制限されたr5rs言語を使用する場合、そのような制限された言語に伴うフラストレーションを経験する可能性が高く、これは、そうでない場合の前向きな経験を簡単に圧倒する可能性があります。
"racket" という言語は不変のコンス セルを使用するため、システムに付属する srfi/1 実装も不変のコンス セルを使用します。
R5RS のコンス セルは変更可能なコンス セルを使用するため、組み込みの srfi/1 を DrRacket の R5RS 言語で使用することはできません。
しかし、それは小さな問題です。http://srfi.schemers.org/srfi-1/srfi-1-reference.scmをダウンロードして、コードがあるディレクトリに保存します。
それを開いて、最初の行に挿入します。
(define (check-arg . more) #t)
次に、独自のコードに次の行を追加します。
(load "srfi-1-reference.scm")
現在、srfi/1 はマップ (およびその他のいくつか) を再定義しています。通常、再定義されたビルトイン操作は偶発的にのみ行われるため、DrRacket のデフォルト設定ではエラーがスローされます。したがって、DrRacket の左下にある R5RS 言語をクリックします。「言語を選択...」を選択します。次に、「詳細を表示」ボタンをクリックします。「初期バインディングの再定義を許可しない」でチェックを外します。
次のプログラムが実行されます。
(load "srfi-1-reference.scm")
(fold + 0 '(1 2 3))
期待どおりに 6 が生成されます。