如何将列表的第一个元素应用于列表的其余部分?
How to apply first element of list to rest of list?
为什么是:
(apply (car (list 'xor)) '(#t #t))
申请:不是程序;
期望一个可以应用于参数的过程
给出:'xor
(apply (car (list (list 'xor))) '(#t #t))
申请:不是程序;
期望一个可以应用于参数的过程
给定:'(异或)
(apply (car '(xor #t #t)) (cdr '(xor #t #t)))
申请:不是程序;
期望一个可以应用于参数的过程
给出:'xor
如何将列表的第一个元素应用到列表的其余部分?
在你的程序中,'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 表达式包含纯引用数据,您可以 eval the expression using a namespace。
我们添加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
为什么是:
(apply (car (list 'xor)) '(#t #t))
申请:不是程序; 期望一个可以应用于参数的过程 给出:'xor
(apply (car (list (list 'xor))) '(#t #t))
申请:不是程序; 期望一个可以应用于参数的过程 给定:'(异或)
(apply (car '(xor #t #t)) (cdr '(xor #t #t)))
申请:不是程序; 期望一个可以应用于参数的过程 给出:'xor
如何将列表的第一个元素应用到列表的其余部分?
在你的程序中,'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 表达式包含纯引用数据,您可以 eval the expression using a namespace。
我们添加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