1樓:窗戶
每次都展開計算一下,往前推一步,完全可行阿。
;利用函式構造惰性計算
(define-syntax
xcons
(syntax-rules
()((
xconsab
)(cons
(lambda ()a
)(lambda ()b
)))))
(define-syntax
xcar
(syntax-rules
()((
xcarx)
((car
x)))))
(define-syntax
xcdr
(syntax-rules
()((
xcdrx)
((cdr
x)))))
;無限流
(define
(make-inf-streamn)
(xconsn(
make-inf-stream(+
n1))))
;列印流
(define
(display-stream
stream)(
if (
null?
stream)(
void)(
begin
(display
(xcar
stream))(
newline)(
display-stream
(xcdr
stream
)))))
;列印一下無限流試試
(display-stream
(make-inf-stream0))
以上可以構造樹狀惰性,如果只要list
(define-syntax
xcons
(syntax-rules
()((
xconsab
)(cons a(
lambda ()b
)))))
(define-syntax
xcar
(syntax-rules
()((
xcarx)
(car
x))))
(define-syntax
xcdr
(syntax-rules
()((
xcdrx)
((cdr
x)))))
把上述這段巨集替代之前的,你可以看到一樣的效果
2樓:ayanamists
(define
int(
lambda(x
)(stream-consx(
int(+ x
1)))))
(stream->list
(int0))
你要是像上面這樣寫,那毫無疑問它會無限迴圈,記憶體也會爆掉;但是在現實問題中,我們不需要把整個流展開啊。。。比如說
(define
int(
lambda(x
)(stream-consx(
int(+ x
1)))))
(define
func
(lambda(x
)(if (
>(stream-firstx)
10)'()
(cons
(stream-firstx)
(func
(stream-rest
x))))))
(func
(int0))
這會得出:'(
0123
4567
8910)
這不就沒問題了嘛。
你從上面這個例子就看出來了,由於惰性求值的存在,流可以無限長,但在現實的計算機裡,流不可能被無限地展開。真正限制了流長度的不是它本身,而是你對他的展開。
《電腦程式的構造和解釋(SICP)》討論的核心問題是什麼?
做夢都想進位元組 我來吐槽下我還沒有看完。看到第二章感覺就是把一些簡單演算法拿lisp寫一遍,lisp看多我快吐了,要是拿scala寫該多好。 三十二 我覺得SICP的核心問題就是,如何通過抽象的方式降低軟體系統設計的複雜度。這本書最大的問題在於,你必須得預設你讀這本書的時候什麼東西都沒學過 畢竟一...
怎樣讓父母理解電腦的構造?
蘇河 最早的時候我是這麼理解的,現在想想其實並不是很準確,但是能讓對電腦一點不懂的人開始有個初步的認識。電腦就好比乙個加工廠,cpu就是生產車間,硬碟是倉庫,記憶體是連線倉庫跟生產車間的通道。工作過程可以這麼理解 原料從倉庫運輸運輸到車間,要經過通道,所以cpu 越好,表示車間生產效率高,但是如果通...
如何解釋列印自己的程式?
時國懷 先按行分解開,這個程式一共有6行 charb 0x22 charn 0xa char c char b 0x22 char n 0xa char c c s c main main 前面定義了三個變數,後面是main函式裡乙個輸出。然後把輸出裡的printf展開,把c和b都替換成具體的值 p...