(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:
XOR:未定义;无法在定义标识符之前引用标识符。
即使在REPL中即使强硬也能正常工作:
(xor #t #f)
t
您需要将提供racket/bool
的xor
放入my-eval
使用的名称空间。一种方法是在(my-eval '(require racket/bool))
测试之前运行xor
。