1

在球拍中,以下工作:

(+ . [1 2]) ; => 3

{ define a + }
(a . [1 2]) ; => 3

但是,我认为没有办法定义b(1 2)列表以便获取(+ . b)(a . b)返回3。可能吗?

4

2 回答 2

2

当然,只需使用apply

(define a +)
(define b '(1 2))
(apply a b)       ; => 3
(apply + b)       ; => 3
于 2013-03-26T11:51:27.450 回答
1

这个怎么样......不使用apply但使用eval. 但说真的,在这种情况下使用apply是一个更好的主意,它没有任何问题(虽然eval 是邪恶的,请参阅文档以了解名称空间的最后一部分):

(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
于 2013-03-26T13:23:18.037 回答