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

时间:2019-09-05 18:05:27

标签: scheme

我正在尝试为Scheme中的类构建一个简单的4函数计算器,这就是我想出的。这个函数需要三个变量。不管我尝试什么,if语句都不起作用,并且总是变成false。

我尝试用诸如“ plus”,“ minus”等字符串替换符号,但是我一直得到相同的结果。

(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语句。

1 个答案:

答案 0 :(得分:0)

您在第一个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)
                    '()))))))

如果没有,则将if视为一个变量,然后它将评估(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))