0

我正在尝试解释关键字和整数列表以获取表达式。如果“输入”是,比如 '(add 5 5),传入的列表将包含 3 个 -> add 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 吗?

4

2 回答 2

1

在最后一行,

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

必须

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

因为在if-comparison中,它必须直接返回数字。但当然,您也可以使用 cond,而不必使用其他比较方法。

要比较字符串,可以使用 best string=? 功能。

更多信息:

于 2013-04-13T01:03:59.417 回答
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等。自动填充,并支持任意数量的参数,并且不需要将整数单独括在括号中的情况:cadrcaddradd

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

pmatch需要一系列子句,例如cond,除了子句中的第一个表达式是一个模式,它可以包含变量。变量通过在它们前面用逗号表示(就像在反引号表达式中一样)。模式中任何前面没有逗号的符号都必须按字面意思匹配。当pmatch找到匹配模式时,它将变量绑定到输入的相应部分中的输入部分。n并且operands是上述模式中的变量。

guard如果您需要的条件不仅仅是匹配模式,您还可以在模式后添加一个子句,例如检查提取的变量是否为整数。

于 2013-04-13T01:36:21.303 回答