プロジェクトのスキームでユーザー入力を読み取ることができる必要があります。たとえば、文字列を読み取れる必要があります4 5 * .
。関数を使用して実装していました(read)
が、 を読み取るとエラーが発生します.
。別のシンボルを使用しますが、プロジェクトの説明で指定されています。これを行う方法はありますか?
1 に答える
read
を使用して任意のテキストを入力することはできません。このread
手順は、Scheme ソース コード式のスーパーセットを表すために使用できるデータ形式である「S 式」の入力のみを目的としています。
.
この手順で aを読み取れない理由はread
、Scheme ソースでピリオド トークンに特別な役割があるためです。ピリオド トークンはドット ペア表記に使用されます。 と(C1 . C2)
のペアをS 式として書く方法です。単一のペアとリスト(2 つのペアから作成される)の間には決定的な違いがあることに注意してください。ソーステキストの唯一の違いは、単一のピリオドの有無です。C1
C2
(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のリーダーソース コードを参照してください。read
get-datum
get-datum-with-source-locations
read-char
あるいは、ユーザーからの入力を読み取る他の方法があるかもしれません。手順は非常に一般的です (またread-line
、 の上に書くのも簡単ですread-char
)。または、パーサー ジェネレーター (Larceny のリーダーのソース コードを生成したものなど、上記のリンクを参照) を調べることもできます。