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
找到匹配模式時,它會將變量綁定到輸入的相應部分中的輸入部分。 n
和operands
是上述模式中的變量。
如果你想要求一個條件不僅僅是匹配模式,比如檢查提取的變量是否是一個整數,你也可以在模式後面加一個guard
子句。
顯然它不是一個字符串?它回來了:string =?:違反合同 預期:字符串? 給出:'add 參數position:1st 其他參數...: 「add」 – V1rtua1An0ma1y
string =?不需要,只需更改cdr和cddr就可以返回10。 – V1rtua1An0ma1y
小心:符號和字符串不是一回事。 「add」與「add」不同。 – erjiang