Scheme 为什么方案中的这些if语句总是导致错误?
我正在尝试为Scheme中的类构建一个简单的4函数计算器,这就是我所想到的。它是一个包含三个变量的函数。不管我怎么做,if语句都不起作用,结果总是错误的 我试着用字符串替换符号,如“加号”、“减号”等,但我一直得到相同的结果Scheme 为什么方案中的这些if语句总是导致错误?,scheme,Scheme,我正在尝试为Scheme中的类构建一个简单的4函数计算器,这就是我所想到的。它是一个包含三个变量的函数。不管我怎么做,if语句都不起作用,结果总是错误的 我试着用字符串替换符号,如“加号”、“减号”等,但我一直得到相同的结果 (define calculator (lambda (val1 operator val2) if (equal? operator +) (+ val1 val2) (if (equal? operator -)
(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挑战赛的第二名。这两个帐户都打得不错。:)谢谢你教我一些东西!