'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
如果我有一个函数和一个参数列表,我可以像这样使用 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