首页 > 解决方案 > 为什么 AND、OR 会按预期工作,但 XOR 会显示错误?

问题描述

(define-syntax e.g.
  (syntax-rules (===>)
    ((e.g. proposition)
     (unless proposition
       (error "invalid proposition: "'proposition)))
    ((e.g. proposition ===> value)
     (let ((result proposition))
       (unless (equal? proposition value)
         (error "invalid proposition: "'proposition
                ", expected "value", got "result))))))

(define my-eval
  (let ((ns (make-base-namespace)))
    (lambda (expr) (eval expr ns))))

(e.g. (my-eval '(and #t #t)) ===> #t)
(e.g. (my-eval '(and #t #f)) ===> #f)
(e.g. (my-eval '(or #t #f)) ===> #t)
(e.g. (my-eval '(or #f #f)) ===> #f)
(e.g. (my-eval '(xor #t #t)) ===> #f)
(e.g. (my-eval '(xor #t #f)) ===> #t)

它适用于 AND,OR 但适用于 XOR:

异或:未定义;不能在定义之前引用标识符。

即使 REPL 中的强硬似乎也能正常工作:

(异或#t#f)

标签: logicschemeracketeval

解决方案


您需要将racket/bool提供. 一种方法是在测试之前运行。xormy-eval(my-eval '(require racket/bool))xor


推荐阅读