从cond返回值

时间:2013-04-13 00:48:45

标签: if-statement scheme

我正在尝试解释关键字和整数列表以获取表达式。如果“输入”是,说'(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?

2 个答案:

答案 0 :(得分:1)

在最后一行,

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

必须是

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

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

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

More info:

答案 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找到匹配的模式时,它会将变量绑定到输入的相应部分中的输入部分。 noperands是上述模式中的变量。

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