【发布时间】:2010-11-18 01:36:47
【问题描述】:
以下是令人惊叹的《Land of Lisp》一书中的示例源代码:
(defun random-node ()
(1+ (random *node-num*)))
(defun edge-pair (a b)
(unless (eql a b)
(list (cons a b) (cons b a))))
(defun make-edge-list ()
(apply #'append (loop repeat *edge-num*
collect (edge-pair (random-node) (random-node)))))
由于我没有 Lisp 直觉,我发现将方法分成多行(作为命令式样式)然后尝试将其变形为函数式样式很有用。
你能帮我把 make-edge-list 函数分成多行吗?
【问题讨论】:
-
至少用 let 表达式替换表达式的组成部分可能会有所帮助。我不确定您在这里使用的确切方言,但您应该能够将其分解为至少更具描述性的形式,例如
(defun make-edge-list () (let ((pair (edge-pair (random-node) (random-node))) (...等。如果您不熟悉,请查找let绑定以获取更多信息。 -
我是否遗漏了什么——是否有理由首先分两步进行?这和
(loop repeat *edge-num* append (edge-pair (random-node) (random-nome)))有区别吗?
标签: functional-programming lisp land-of-lisp