2

プロジェクトのスキームでユーザー入力を読み取ることができる必要があります。たとえば、文字列を読み取れる必要があります4 5 * .。関数を使用して実装していました(read)が、 を読み取るとエラーが発生します.。別のシンボルを使用しますが、プロジェクトの説明で指定されています。これを行う方法はありますか?

4

1 に答える 1

1

readを使用して任意のテキストを入力することはできません。このread手順は、Scheme ソース コード式のスーパーセットを表すために使用できるデータ形式である「S 式」の入力のみを目的としています。

.この手順で aを読み取れない理由はread、Scheme ソースでピリオド トークンに特別な役割があるためです。ピリオド トークンはドット ペア表記に使用されます。 と(C1 . C2)のペアをS 式として書く方法です。単一のペアリスト(2 つのペアから作成される)の間には決定的な違いがあることに注意してください。ソーステキストの唯一の違いは、単一のピリオドの有無です。C1C2 (C1 . C2) (C1 C2)

ドット ペア表記については、R5RS のセクション 6.3.2 で説明されています。

そのため、Dan D. による質問に対するコメントで示唆されているように、このread-char手順を使用してユーザー入力テキストを使用することを検討する必要があります。R5RS のセクション6.6.2 で説明されています。read-charは多くの文字を消費するのに 1 文字しか消費しないread(そして潜在的に大きな構造化データのツリーを構築する)ため、直観に反するように思えるかもしれませんが、実際にはread-char、 で繰り返し呼び出すことにより、の上に独自のパーサーを構築できます。ループ、Dan D. の提案による

実際、一部のスキーム システムはread、 を呼び出すスキーム プロシージャにすることで自身を実装していますread-char。たとえば、Larcenyのリーダーソース コードを参照してください。readget-datumget-datum-with-source-locationsread-char

あるいは、ユーザーからの入力を読み取る他の方法があるかもしれません。手順は非常に一般的です (またread-line、 の上に書くのも簡単ですread-char)。または、パーサー ジェネレーター (Larceny のリーダーのソース コードを生成したものなど、上記のリンクを参照) を調べることもできます。

于 2013-02-10T16:27:48.367 に答える