我正在尝试解释一个关键字和整数列表以获得一个表达式。如果"input“是‘( -> 5 5),那么传入的列表将包含3个条目并加上5 5
(define (evaluate input)
(if (integer? input)
input
(cond ((integer? (car input))
(car input))
((equal? (car input) "add")
(+ (evaluate (cdr input))
(evaluate (cddr input))))
~more~
我使用'if‘是因为cond不喜欢仅仅返回值。我的问题是:相等吗?实际上正确地比较字符串,并且应该(+ evaluate (...)评估(...)在这种情况下实际上返回10?
发布于 2013-04-13 01:03:59
在最后一行,
(+ (evaluate (cdr input)) (evaluate (cddr input))))
必须是
(+ (evaluate (cadr input)) (evaluate (caddr input))))
因为在if比较中,它必须直接返回数字。当然,你也可以使用cond,你不需要使用其他的比较方法。
要比较字符串,可以使用best string=?函数。
发布于 2013-04-13 01:36:21
add
实际上是一个方案符号,而不是一个字符串,所以您可以只使用eq?
(define (evaluate input)
(cond
[(integer? input)
input]
[(integer? (car input))
(car input)]
[(eq? 'add (car input))
(+ (evaluate (cadr input) (caddr input)))]))
顺便说一句,看起来你真正想做的是在输入匹配模式时对其进行“解构”:即提取存储在输入中的内容。奥列格·基塞洛夫有一个很好的小宏,叫做pmatch
,它可以帮你做到这一点。从http://www.cs.indiana.edu/cgi-pub/c311/lib/exe/fetch.php?media=pmatch.scm下载。然后,您可以编写以下代码,它自动处理所有cdr
/cadr
/caddr
/etc.内容,并支持add
的任意数量的参数,并且不需要整数单独包含在括号中的情况:
(define (evaluate input)
(pmatch input
[,n (guard (integer? n))
n]
[(add . ,operands)
(apply + (map evaluate operands))]))
pmatch
需要一系列的子句,就像cond
一样,除了子句中的第一个表达式是一个模式,它可以包含变量。变量通过在它们前面加上逗号来表示(就像在反引号表达式中一样)。模式中任何前面没有逗号的符号都必须按字面意思匹配。当pmatch
找到匹配模式时,它将变量绑定到输入的相应部分中的输入部分。n
和operands
是上述模式中的变量。
如果除了匹配模式之外还需要条件,也可以在模式后面加上guard
子句,比如检查提取的变量是否为整数。
https://stackoverflow.com/questions/15982987
复制