Common Lisp中的"unfold"是什么?

9

我从SICP学到了一些scheme知识,但现在更感兴趣的是common lisp。我知道common lisp的foldreduce,有左折叠或右折叠的特殊参数,但是unfold的等效方法是什么?谷歌搜索并没有帮助太多。实际上,我得出的印象是没有unfold???

2个回答

13

通用Lisp有(loop ... collect ...)。与其等效地使用unfold进行比较:

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

相当于:

(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

3
常见的Lisp Hyperspec并没有定义unfold函数,但是你可以自己编写。它的Scheme定义几乎一字不差。

3
谢谢。这很不幸,但我想我会自己写。我非常喜欢Scheme因为它非常纯粹,拥有如此美妙的函数式优点,但我已经决定学习纷繁复杂但表达丰富的Common Lisp了。这有点像学习英语而不是世界语,你知道吗? - nullpointer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接