在Racket中,以下作品:
(+ . [1 2]) ; => 3
{ define a + }
(a . [1 2]) ; => 3
但是,我认为无法将b
定义为(1 2)
列表,以便让(+ . b)
和(a . b)
返回3
。有可能吗?
答案 0 :(得分:2)
当然,只需使用apply
:
(define a +)
(define b '(1 2))
(apply a b) ; => 3
(apply + b) ; => 3
答案 1 :(得分:1)
如何...不使用apply
但使用eval
。但严重的是,在这种情况下使用apply
是一个更好的主意,它没有任何问题(eval
is evil,请参阅documentation以了解命名空间的最后一部分):
(define a +)
(define b '(1 2))
; executing in the evaluation window
(eval `(+ ,@b))
=> 3
(eval `(a ,@b))
=> 3
; executing from the definitions window
(define-namespace-anchor an)
(define ns (namespace-anchor->namespace an))
(eval `(+ ,@b) ns)
=> 3
(eval `(a ,@b) ns)
=> 3