1

Scheme で独自の減算関数を実装しようとしています。ユーザーの入力に減算を適用するには、apply メソッドを使用する必要があります。問題は、ユーザー入力は ()、[]、または {} の間でなければならないということです (私は小さな言語用の小さなインタープリターを書いています)。私はすでに開始ブラケットをうまく管理しているコードを持っていますが、私の問題は残りのために apply メソッドを使用しています。閉じ括弧の前に入力されたデータのみを読み取る必要があります。入力を読み取り、区切り文字「)」、「]」、または「{}」で停止する方法はありますか。たった 1 つの区切り記号について正しい方向に導くことができたとしても、残りの部分を機能させることができます。

これが私がやろうとしていることです:

(define subt (lambda (x)
             (apply - (read-line))))

しかし、閉じ括弧で読むのを止めたいです。

4

2 に答える 2

1

開き括弧を見つけるたびに、それをスタックに追加し、途中で読み取った文字をデータ構造、たとえば新しいリストまたは構文ツリーに追加し始めます (注意: 行ごとではなく、文字ごとに読み取る必要がありますあなたのコードで暗示されているように!)。スタック内の一番上の要素に対応する閉じ括弧を見つけるたびに、スタックから一番上の括弧をポップし、文字のリストへの要素の追加を停止します。この時点で、使用中のデータ構造で完全な式が読み込まれたことがわかります。評価を進めることができます。

また、エバリュエーターがリスト、構文ツリー、またはパーサーによって返される中間表現を受け取り、文字の読み取りについて心配する必要がないように、入力を解析するためのコードを評価するためのコードから分離する必要があります。 、一致する括弧の検索など。

編集

パーサーをゼロから実装する必要がない場合は、 @ GoZoner で提案されているように、組み込みプロシージャを含む単純なソリューションで十分です。次のようreadに、入力番号を()入力してから入力を終了することを確認するプロシージャを使用します。これ:

(define (subt)
  (apply - (read)))

(subt)
 input: (10 2 1)
output: 7
于 2013-04-22T16:18:26.703 に答える