2009-10-26 244 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