如何将列表中的第一个元素应用到列表的其他元素中?

问题描述 投票:0回答:1

为什么是

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

应用:不是一个过程;期望是一个可以应用于给定参数的过程:"xor"。

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

应用:不是存储过程;预期存储过程可以应用于给定的参数:'(xor)

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

应用:不是存储过程;期望存储过程可以应用于给定的参数:'xor'。

如何将 list 的第一个元素应用到 list 的其余元素上?

racket
1个回答
1
投票

在你的程序中。'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表达式中包含纯引号的数据,你可以用 评价 表达式 命名空间.

我们增加 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
© www.soinside.com 2019 - 2024. All rights reserved.