在Racket中,如果使用点表示法构造未引用的对,是否可以对第二个元素使用变量或表达式值?

时间:2013-03-26 06:48:43

标签: scheme racket

在Racket中,以下作品:

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

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

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

2 个答案:

答案 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