【发布时间】:2013-10-17 11:04:46
【问题描述】:
我们在 P.Graham 的“ANSI Common Lisp”(第 110 页)中找到了这个函数构建器来实现组合。 参数是 n>0 引用的函数名称。我没有完全理解,所以我将在此处引用代码并在其下方指定我的问题:
(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)))))
compose 的参数列表被反转和解包,它的(现在是第一个)元素绑定到“fn1”,其余元素绑定到“rest”。 最外层 lambda 的主体是 reduce: (funcall fi (funcall fi-1 ... ) ),操作数倒序恢复初始操作数。
1) 最外层的 lambda 表达式的作用是什么?即,它从哪里得到它的“参数”?它是指定为解构绑定的第一个参数的数据结构吗? 2) 最里面的 lambda 从哪里获取它的两个参数?
我的意思是我可以理解代码的作用,但词法范围对我来说还是有点神秘。 期待任何和所有的cmets! 提前致谢, //马可
【问题讨论】:
-
为什么都是吊括号?
-
抱歉,我在stackoverflow.com/questions/5928106/…没有看到关于这个的讨论
-
@Marcin ,引导眼睛;)这是不好的做法吗?我还是个菜鸟
-
它可能是第一个具有 sexpr 语法的苹果 dylan 版本
-
Marco Zocca,@Marcin 的观点,更简洁地说,大多数 Lisp 用户阅读的是缩进,而不是括号。
标签: functional-programming lisp common-lisp