2013-04-22 487 views
1

我想在Scheme中實現我自己的減法函數。我必須使用apply方法將減法應用於用戶的輸入。事情是,用戶輸入必須介於(),[]或{}之間(我正在爲小語言編寫一個小解釋器)。我的代碼已經管理好了,但是我的問題是使用apply方法。我只需要讀取在右括號之前輸入的數據。有沒有辦法讀取輸入並在分隔符「)」,「]」或「{}」處停止。即使你可以用一個分隔符指引正確的方向,我也可以讓其餘的工作。如何在輸入特定字符時停止閱讀輸入?

這裏就是我想要做的事:

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

但我想讓它停在右括號閱讀。

回答

1

read過程讀取#\(#\)之間方案的形式。假設括號是適當的分隔符以下工作:

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

當然,-預計數字和read將返回任何方案的形式。

> (subt 'ignore) 
(10 5 3 1) 
1 
1

只要你找到一個左括號,將它添加到一個堆棧中,並開始將你讀過的字符添加到數據結構中,比如說一個新的列表或語法樹(注意:你必須逐個字符地閱讀,沒有像你的代碼中所暗示的那樣一行一行!)。每當找到堆棧中最頂層元素對應的右括號時,從堆棧中彈出最頂層的括號,並停止向元素列表中添加元素 - 此時您知道在使用的數據結構中已經讀取了完整的表達式並可以繼續進行評估。

此外,您應該分離用於解析輸入的代碼以評估它,以評估者接收列表,語法樹或解析器返回的任何中間表示形式的方式,而不必擔心讀取字符,找到匹配的括號等

編輯

如果你沒有從頭開始實現一個解析器需要,包括內置的程序簡單的解決方案會做,所建議@ GoZoner:使用read程序,確保輸入數字在()和ð結束輸入與一回,像這樣:

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

(subt) 
input: (10 2 1) 
output: 7