我正在尝试解释关键字和整数列表以获取表达式。如果“输入”是,说'(add 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(...)evaluate(...))在这种情况下实际上应该返回10?
答案 0 :(得分:1)
在最后一行,
(+ (evaluate (cdr input)) (evaluate (cddr input))))
必须是
(+ (evaluate (cadr input)) (evaluate (caddr input))))
因为在if-comparison中,它必须直接返回数字。但是,当然,你也可以使用cond,你不必使用其他比较方法。
要比较字符串,可以使用最佳字符串=?功能。
答案 1 :(得分:1)
add
实际上是一个Scheme符号,而不是字符串,因此您只需使用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下载。然后,您可以编写以下内容,处理cdr
/ cadr
/ caddr
/等所有内容。自动填充,并支持add
的任意数量的参数,并且不需要在括号中单独包含整数的情况:
(define (evaluate input)
(pmatch input
[,n (guard (integer? n))
n]
[(add . ,operands)
(apply + (map evaluate operands))]))
pmatch
期望一系列子句,如cond
,除了子句中的第一个表达式是一个模式,它可以包含变量。变量通过在它们前面加上逗号来表示(就像在反引号表达式中一样)。模式中不带逗号的任何符号必须按字面顺序匹配。当pmatch
找到匹配的模式时,它会将变量绑定到输入的相应部分中的输入部分。 n
和operands
是上述模式中的变量。
如果您想要一个超出匹配模式的条件,您还可以在模式后面添加guard
子句,例如检查提取的变量是否为整数。