在您的程序中,'xor 是一个符号,而不是一个过程。在下面的程序中,xor指的是实际的程序,不是符号-
(apply (car (list xor)) (list #t #t))
; #f
(apply (car (list xor)) (list #t #f))
; #t
或者简单地说-
(apply xor (list #t #f))
; #t
当你写'(xor #t #t)时,xor被引用并变成符号-
(car '(xor #t #t))
; 'xor
您可以使用准引用 `(...),但您最不引用 ,... 任何您不想转换为符号的内容 -
(apply (car `(,xor #t #t)) (cdr `(,xor #t #t)))
; #f
(apply (car `(,xor #t #f)) (cdr `(,xor #t #f)))
; #t
大概s-表达式将在别处构造-
(define sexpr1 (list xor #t #t))
(define sexpr2 (list xor #t #f))
(apply (car sexpr1) (cdr sexpr1)) ;#f
(apply (car sexpr2) (cdr sexpr2)) ;#t
如果 s 表达式包含纯粹引用的数据,您可以使用 namespace eval 表达式。
我们添加racket/base 以允许程序应用。程序中的过程xor 包含在racket/bool 中 -
(define (run-sexpr sexpr)
(parameterize ((current-namespace (make-base-empty-namespace)))
(namespace-require 'racket/base)
(namespace-require 'racket/bool)
(eval sexpr)))
(run-sexpr '(xor #t #t)) ;#f
(run-sexpr '(xor #t #f)) ;#t
上面我们eval 是整个s 表达式,但这可能不是我们想要的。为了使程序工作,我们只需要eval 将'xor 符号变成一个有意义的过程,xor。这可能最接近您最初的目标 -
(define (run-sexpr sexpr)
(parameterize (...)
(...)
(apply (eval (car sexpr)) ;only eval car
(cdr sexpr)))) ;apply cdr verbatim
(run-sexpr '(xor #t #t)) ;#f
(run-sexpr '(xor #t #f)) ;#t