【问题标题】:How to apply first element of list to rest of list?如何将列表的第一个元素应用于列表的其余部分?
【发布时间】:2020-05-06 02:25:20
【问题描述】:

为什么:

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

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

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

应用程序:不是程序; 期望一个可以应用于参数的过程 给定:'(异或)

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

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

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

【问题讨论】:

    标签: racket


    【解决方案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 表达式包含纯粹引用的数据,您可以使用 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
    

    【讨论】:

    • 如果我想将汽车应用到任意 s-expr 的 cdr 上怎么办?如何将逗号放在 car 前面的 quasiquoted 表达式中?
    • @X10D,在我的编辑中链接的eval 指南向您展示了我们在评估任意引用数据时必须考虑的事情。请查看我更新的答案以查看应用于各种参数的'xor 符号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    相关资源
    最近更新 更多