'apply' 的替代方法

Alternate way to do an 'apply'

如果我有一个函数和一个参数列表,我可以像这样使用 apply

(apply func args)

例如:

(apply + '(1 2 3))

现在,如果我按如下方式定义函数 func 和参数列表 args

(define func +)
(define args '(1 2 3))

为什么以下对 运行 函数不起作用:

(append (list func) args)
(cons func args)          ; same thing
; (#<procedure:+> 1 2 3)

我认为 append 会创建 (+ 1 2 3),就像 (append '(1) '(2 3)) 创建 (1 2 3) 一样。

为什么没有发生这种情况,有没有办法像我上面尝试的那样使用 append 到 'act like' 和 apply

它确实发生了。 (append (list func) args)(cons func args) 确实创建了相同的列表,(#<procedure:+> 1 2 3)

但这只是一个列表,一个数据。要“运行”它,你需要评估它:

> (eval (cons func args) (null-environment 5))
6

> (eval (append (list func) args) (null-environment 5))
6