2012-01-04 6 views
3

私が持っている機能:スキームinfinteループとメモリ

((lambda (x) (x x)) 
(lambda (x) (x x))) 

をし、それが無限ループを生成します。私の質問は、メモリマップについてです。私たちはスタックがオーバーフローすることを知っています。なぜなら、私は各呼び出しごとに新しいフレームを開くからです。しかし、何がヒープになりますか?私が理解しているように、すべての呼び出しでヒープに新しいクロージャが作成されますが、これについてはわかりません。

答えて

5

Schemeはtail call optimization(またはそれに相当するもの)を要求しているため、スタックはオーバーフローしません。新しいコールフレームは作成されません。また、この関数を実行するには、一定のヒープ割り当てのみが必要です。通訳者は2つのクロージャを生成する2つのlambda式を評価するだけでよい。あなたがメモリをいっぱいにしたい場合は

(let loop ((l 0)) 
    (loop (cons l l))) 
+0

ような何かを行うので、私はループをinifinteに来てなぜですか? –

+0

紙で評価してみてください。 –

+3

いいえ、SchemeはTCOを要求しません。適切なテールコール(PTC)を要求します。つまり、無制限のテールコールは無制限のメモリを消費できません。 TCOはPTCを実装する方法の1つですが、他にも「チェイニー・オン・ザ・MTA」などのアプローチがあります。 –