2009-10-26 304 views
9

我从SICP了解了一些计划,但现在对通用的lisp更感兴趣。我知道普通lisp的foldreduce,有左或右折叠的特殊参数,但是相当于unfold?谷歌搜索没有多大帮助。事实上,我得到的印象是没有展开的?“unfold”for common lisp?

回答

13

Common Lisp有(loop ... collect ...)。比较

 
(loop for x from 1 to 10 collect (* x x)) 

使用unfold其等价:

 
(unfold (lambda (x) (> x 10)) 
    (lambda (x) (* x x)) 
    (lambda (x) (+ x 1)) 
    1) 

一般来说,(unfold p f g seed)基本上是

 
(loop for x = seed then (g x) until (p x) collect (f x)) 

编辑:修正了错字

+2

嗯,这很有趣。过去一个小时我一直在玩循环:P它的好东西!我喜欢编程语言有这些嵌入式子语言,它们有自己的语法和一套要理解的规则,比如格式化字符串。循环是强大的东西! – nullpointer 2009-10-26 20:47:14

+2

欢迎来到黑暗之城。 – huaiyuan 2009-11-05 20:50:13

3

通用lisp hyperspec没有定义一个unfold函数,但是你当然可以编写自己的函数。它的方案定义为符号翻译几乎符号。

+3

感谢。这是不幸的,但我想是的,我会写我自己的。我真的很喜欢这样纯粹的计划,拥有如此美丽的功能性善良,但我有点自to为学习纠结而又富于表现力的共同诽谤。这有点像学习英语而不是世界语,你知道吗? – nullpointer 2009-10-26 05:55:29