Logic 为什么AND、OR按预期工作,但XOR显示错误?

Logic 为什么AND、OR按预期工作,但XOR显示错误?,logic,scheme,racket,eval,Logic,Scheme,Racket,Eval,对于AND或但对于XOR,它可以正常工作: XOR:未定义; 无法在标识符定义之前引用该标识符 即使是REPL中的棘手问题似乎也能正常工作: (xor#t#f) T 您需要要求racket/bool,它提供了xor,进入my eval使用的命名空间。一种方法是在xor测试之前运行(my eval'(require racket/bool)) 问题是谁有时间阅读这样的全部文件 你不必一次读完全部内容,但这就是信息所在,Racket有很多很棒的文档 eval球拍可能有点滑;您需要完成对eval表达式

对于AND或但对于XOR,它可以正常工作:

XOR:未定义; 无法在标识符定义之前引用该标识符

即使是REPL中的棘手问题似乎也能正常工作:

(xor#t#f)

T
您需要要求
racket/bool
,它提供了
xor
,进入
my eval
使用的命名空间。一种方法是在
xor
测试之前运行
(my eval'(require racket/bool))

问题是谁有时间阅读这样的全部文件

你不必一次读完全部内容,但这就是信息所在,Racket有很多很棒的文档

eval
球拍可能有点滑;您需要完成对
eval
表达式求值的命名空间的设置。一种方法是使用创建空名称空间。这需要发生在
lambda
表达式内部,即计算
eval
的环境中,您需要确保
racket/base
racket/bool
都是
需要的
d:

(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)

还有什么方法可以查看名称空间的内容吗?(println namespace)returns#有一个文档,它告诉您,
xor
不在
racket/base
中。还有,是的,我在这里找到了xor:是的,现在我看到有一个包含xor的部分,其中包含介绍:“本节中记录的绑定由racket/bool和racket库提供,但不是racket/base。“问题是谁有时间阅读这样的全部文件?浏览的方式是我进入一个页面,使用ctrl-f键查找我正在寻找的函数。“问题是谁有时间阅读这样的全部文档?”有一个著名的缩写词……我尝试了(require racket/bool)和(require racket)两种方法,都是在文件顶部的#lang racket下方,但都不起作用。对于上面的代码,您需要
xor
my eval
使用的命名空间中,而不是在定义
的模块中,例如
。这是两种不同的环境。(如果您想将模块的环境转换为一个名称空间,您可以使用
eval
,使用
定义名称空间锚定
名称空间锚定->名称空间
),那么仅将(require racket/bool)放在文件顶部是不够的?在其他方案变量中评估某个内容是否如此复杂?这种设计的原因在哪里?方案哲学不是最简单的吗?(例如:(我的评估’(xor#t#t))===>#f)返回:xor:未绑定标识符;此外,没有#%app syntax transformer被绑定到:xo和eval之前用于AND和OR,现在它也被破坏了:AND:unbound identifier;此外,没有绑定#%app syntax transformer:and@X10D--我必须添加require并移动
参数化表达式;最初的答案似乎对我有效,但我是在emacs REPL中测试,而不是在Dr Racket中运行。当我测试REPL中的
表达式时,它们工作正常,但作为程序运行时失败,正如您所发现的。这次在Dr Racket进行测试;现在一切似乎都好了。
#lang racket

(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
  (lambda (expr)
    (parameterize ([current-namespace (make-base-empty-namespace)])
      (namespace-require 'racket/base)
      (namespace-require 'racket/bool)
      (eval expr))))

(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)