2013-04-13 105 views
0

我試圖解釋一個關鍵字和整數列表來獲取表達式。如果「輸入」,說「(加5),進入的列表將包含3件 - >添加5來自cond的返回值

(define (evaluate input) 
    (if (integer? input) 
     input 
     (cond ((integer? (car input)) 
       (car input)) 
      ((equal? (car input) "add") 
       (+ (evaluate (cdr input)) 
       (evaluate (cddr input)))) 
~more~ 

我使用的是‘如果’,因爲COND不喜歡只是返回值。我的問題是:平等嗎?實際上比較字符串,如果(+評估(...)評估(...))在這種情況下實際返回10?

回答

1

在最後一行,

(+ (evaluate (cdr input)) (evaluate (cddr input)))) 

必須

(+ (evaluate (cadr input)) (evaluate (caddr input)))) 

因爲在IF-比較,它具有直接返回的數量。但是,當然,您也可以使用cond,而不必使用其他比較方法。

要比較字符串,你可以使用最好的字符串=?功能。

More info:

+0

顯然它不是一個字符串?它回來了:string =?:違反合同 預期:字符串? 給出:'add 參數position:1st 其他參數...: 「add」 – V1rtua1An0ma1y

+0

string =?不需要,只需更改cdr和cddr就可以返回10。 – V1rtua1An0ma1y

+0

小心:符號和字符串不是一回事。 「add」與「add」不同。 – erjiang

1

add實際上是一個方案符號,而不是一個字符串,那麼你可以用eq?

(define (evaluate input) 
    (cond 
    [(integer? input) 
     input] 
    [(integer? (car input)) 
     (car input)] 
    [(eq? 'add (car input)) 
     (+ (evaluate (cadr input) (caddr input)))])) 

順便說一句,它看起來像你真正想要做的是「解構「匹配模式時的輸入:即提取存儲在輸入內的東西。 Oleg Kiselyov有一個很好的叫做pmatch的小宏,可以爲你做到這一點。從http://www.cs.indiana.edu/cgi-pub/c311/lib/exe/fetch.php?media=pmatch.scm下載它。然後你可以編寫以下代碼,它可以處理所有那些/ etc。東西自動,並支持到add任何數量的參數,並且不需要在那裏的整數。在括號中單獨所包圍的情況下:

(define (evaluate input) 
    (pmatch input 
    [,n (guard (integer? n)) 
     n] 
    [(add . ,operands) 
     (apply + (map evaluate operands))])) 

pmatch期望的一系列條款,如cond,除了在第一表達該子句是一個可以包含變量的模式。變量在前面用逗號表示(就像在反引號表達中一樣)。模式中任何不以逗號開頭的符號必須按字面順序匹配。當pmatch找到匹配模式時,它會將變量綁定到輸入的相應部分中的輸入部分。 noperands是上述模式中的變量。

如果你想要求一個條件不僅僅是匹配模式,比如檢查提取的變量是否是一個整數,你也可以在模式後面加一個guard子句。

+0

我欣賞額外的信息,但不幸的是我僅限於這個項目的一小部分內置函數:( – V1rtua1An0ma1y

+0

_assignment_?Ew。 –