为什么我在Scheme中会收到未绑定变量错误?

3
(define (even-odd x)
(if ( ==(% x 2 ) 0) (1) (0)))

当我调用(even-odd 5)时,我会收到以下消息

;Unbound variable: %
;To continue, call RESTART with an option number:
; (RESTART 11) => Specify a value to use instead of %.
; (RESTART 10) => Define % to a given value.
; (RESTART 9) => Return to read-eval-print level 9.
; (RESTART 8) => Return to read-eval-print level 8.
; (RESTART 7) => Return to read-eval-print level 7.
; (RESTART 6) => Return to read-eval-print level 6.
; (RESTART 5) => Return to read-eval-print level 5.
; (RESTART 4) => Return to read-eval-print level 4.
; (RESTART 3) => Return to read-eval-print level 3.
; (RESTART 2) => Return to read-eval-print level 2.
; (RESTART 1) => Return to read-eval-print level 1.

开始调试程序?(输入y或n):

我做错了什么吗?同时请告诉我如何在edwin中选择文本。


这个问题假设'=='和'%'在所有语言中都有相同的普遍含义,但事实并非如此。 - dyoo
3个回答

4
您在这里有几个问题;即您试图调用的过程名称错误。
  • % 应该是 modulo
  • == 应该是 eqv?
  • 如zvrba所指出,删除括号中的0和1

或者,如果您只是想判断一个数字是偶数还是奇数,更简单、更清晰的方法是直接使用内置的even?

(even? 5)
> #f

或者如果您实际上希望得到0和1作为结果,更简洁的表达式可以是
(if (even? x) 1 0)

3
这是一种更符合习惯的编写“even-odd”过程的方式:
(define (even-odd x)
    (if (zero? (modulo x 2))
        #t
        #f))

稍微简短一点:

(define (even-odd x)
    (zero? (modulo x 2)))

或者更好的方法是,使用内置的过程even?

(even? x)

3
你必须省略返回值(1和0)周围的括号。你写的内容试图调用名为1和0的过程。此外,取模运算符不是% ,而是另有名称[请查阅手册;我忘记了——可能是mod或rem]。

1
取模运算符是modulo。此外,==不是一个运算符 - 你应该使用eq? - dagoof
@dagoof 谢谢。我也意识到我必须用“=”替换“==”。 - karthik A

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接