Racket 如何将列表的第一个元素应用于列表的其余部分?

Racket 如何将列表的第一个元素应用于列表的其余部分?,racket,Racket,原因是: 应用:不是一个程序; 应为可应用于参数的过程 给定:xor (apply (car (list 'xor)) '(#t #t)) (apply (car (list (list 'xor))) '(#t #t)) 应用:不是一个程序; 应为可应用于参数的过程 给定:'(异或) 应用:不是一个程序; 应为可应用于参数的过程 给定:xor (apply (car (list 'xor)) '(#t #t)) (apply (car (list (list 'xor))) '(#t #

原因是:

应用:不是一个程序; 应为可应用于参数的过程 给定:xor

(apply (car (list 'xor)) '(#t #t))
(apply (car (list (list 'xor))) '(#t #t))
应用:不是一个程序; 应为可应用于参数的过程 给定:'(异或)

应用:不是一个程序; 应为可应用于参数的过程 给定:xor

(apply (car (list 'xor)) '(#t #t))
(apply (car (list (list 'xor))) '(#t #t))

如何将列表的第一个元素应用于列表的其余部分?

在您的程序中,
'xor
是一个符号,而不是一个过程。在下面的程序中,
xor
指的是实际的过程,而不是符号-

(apply (car '(xor #t #t)) (cdr '(xor #t #t)))
(car '(xor #t #t))
; 'xor
或者干脆-

(apply (car (list xor)) (list #t #t))
; #f

(apply (car (list xor)) (list #t #f))
; #t
当你写
”(xor#t#t)
时,
xor
被引用并变成符号-

(apply xor (list #t #f))
; #t
您可以使用准引号
`(…)
,但大多数情况下,您可以取消引号
,…
任何您不想转换为符号的内容-

(apply (car '(xor #t #t)) (cdr '(xor #t #t)))
(car '(xor #t #t))
; 'xor
推测s表达式将在其他地方构造-

(apply (car `(,xor #t #t)) (cdr `(,xor #t #t)))
; #f

(apply (car `(,xor #t #f)) (cdr `(,xor #t #f)))
; #t

如果s表达式包含纯引用的数据,则可以使用

我们添加了
racket/base
,以允许程序应用。程序中的过程,
xor
,包含在
racket/bool
-

(define sexpr1 (list xor #t #t))
(define sexpr2 (list xor #t #f))

(apply (car sexpr1) (cdr sexpr1)) ;#f
(apply (car sexpr2) (cdr sexpr2)) ;#t
上面我们
eval
计算了整个s表达式,但这可能不是我们想要的。为了使程序工作,我们只需要
eval
'xor
符号转换为一个有意义的过程,
xor
。这可能是最接近你最初的目标-

(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

如果我想将汽车应用于cdr和任意s-expr,该怎么办?如何在准整数表达式中将逗号放在car前面?@X10D,我的编辑中链接的指南向您展示了计算任意引用数据时必须考虑的事项。请参阅我的更新答案,以查看应用于各种参数的异或符号。