Scheme 为什么方案中的这些if语句总是导致错误?

Scheme 为什么方案中的这些if语句总是导致错误?,scheme,Scheme,我正在尝试为Scheme中的类构建一个简单的4函数计算器,这就是我所想到的。它是一个包含三个变量的函数。不管我怎么做,if语句都不起作用,结果总是错误的 我试着用字符串替换符号,如“加号”、“减号”等,但我一直得到相同的结果 (define calculator (lambda (val1 operator val2) if (equal? operator +) (+ val1 val2) (if (equal? operator -)

我正在尝试为Scheme中的类构建一个简单的4函数计算器,这就是我所想到的。它是一个包含三个变量的函数。不管我怎么做,if语句都不起作用,结果总是错误的

我试着用字符串替换符号,如“加号”、“减号”等,但我一直得到相同的结果

(define calculator
  (lambda (val1 operator val2)
    if (equal? operator +) 
        (+ val1 val2) 
        (if (equal? operator -) 
            (- val1 val2)
            (if (equal? operator *) 
                (* val1 val2)
                (if (equal? operator /) 
                    (/ val1 val2)
                    '())))))

(display (calculator 1 + 2))

所有语句的计算结果都为false,我得到最后一个if语句中的else语句。

第一个
if
表单周围缺少括号。应该是这样的:

(define calculator
  (lambda (val1 operator val2)
    (if (equal? operator +) 
        (+ val1 val2) 
        (if (equal? operator -) 
            (- val1 val2)
            (if (equal? operator *) 
                (* val1 val2)
                (if (equal? operator /) 
                    (/ val1 val2)
                    '()))))))
如果将
视为变量,则不使用
,则它将计算
(equal?operator+)
(+val1 val2)
(if..)
,然后始终计算
”()
,最终总是作为返回值

当您有
if
elseif
类型的配置时,最好使用
cond

(define calculator
  (lambda (val1 operator val2)
    (cond ((equal? operator +) (+ val1 val2)) 
          ((equal? operator -)  (- val1 val2))
          ((equal? operator *) (* val1 val2))
          ((equal? operator /) (/ val1 val2))
          (else '()))
也要知道这可以写成:

(define (calculator val1 operator val2)
  (operator val1 val2))

您使用的是什么方案实现?您还应该能够使用
eq?
而不是
equal?
-可能会稍微便宜一点。@AshtonWiersdorf因为
操作符
是一个过程,它可能不足以与
eq?
进行比较,但是
eqv?
对于R6RS和更高版本是安全的。我把它保持原样,因为它是OPs挑战赛的第二名。这两个帐户都打得不错。:)谢谢你教我一些东西!