【发布时间】:2020-06-26 09:43:14
【问题描述】:
在 Paul Graham 的书中,On Lisp,第 66 页,我们有这个功能:
(defun compose (&rest fns)
(if fns
(let ((fn1 (car (last fns)))
(fns (butlast fns)))
#'(lambda (&rest args)
(reduce #'funcall fns
:from-end t
:initial-value (apply fn1 args))))
#'identity))
[这个函数是这样写的,在 Paul Graham 的书,Ansi Common Lisp,第 110 页]:
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
例如:
CL-USER> (funcall (compose #'1+ #'find-if) #'oddp '(2 3 4))
4
我知道已经有人问过有关此功能的问题,并且许多答案都有
已经提供:
(compose) in Common Lisp
Compose example in Paul Graham's ANSI Common Lisp
但我总有一件事不清楚。 我知道:
fn1 <# <FUNCTION FIND-IF>
fns <(# <FUNCTION 1+>)>
args <(#<FUNCTION ODDP> (2 3 4))>
但是,我不明白该指令是如何工作的:
(apply fn1 args)
我认为通过单独测试,将fn1 替换为#'find-if,将args 替换为(#'oddp (2 3 4)):
(apply #'find-if #'oddp '(2 3 4))
or
(apply #'find-if (#'oddp (2 3 4)))
它会起作用,但它不会:
CL-USER> (apply #'find-if #'oddp '(2 3 4))
; Evaluation aborted on #<UNKNOWN-KEYWORD-ARGUMENT {10036BBD03}>.
CL-USER> (apply #'find-if (#'oddp (2 3 4)))
; Evaluation aborted on #<SB-INT:COMPILED-PROGRAM-ERROR {1003DE6413}>.
CL-USER> (apply #'find-if '(#'oddp (2 3 4)))
; Evaluation aborted on #<TYPE-ERROR expected-type: (OR FUNCTION SYMBOL) datum: #'ODDP>.
有人可以向我解释一下这个指令是如何工作的吗? 预先感谢您的宽容和回复。
【问题讨论】:
标签: lisp common-lisp