2012-04-15 13 views
1

私は自動プログラム合成のための単純な関数言語を実装しようとしています。 データ構造は関数と値のグラフで、javascriptにコンパイルされます。 次のグラフは折り畳み機能です。 funcAppノードは、関数ノードといくつかの値ノードに接続され、値に関数を適用します。 arg0がリスト、arg1が初期値(z)arg2が適用される関数です。怠惰な評価なしで単純な純関数言語でfoldを実装する

enter image description here

それは

(define (foldr f z xs) 
    (if (null? xs) 
     z 
     (f (car xs) (foldr f z (cdr xs))))) 

問題が特別な存在しないので、あるということです(私の「言語」はスキームではないが、それはグラフがある)folloiwngスキームの定義に相当します演算子、すべて、特にifは単なる正常な関数です。この形式では、プログラムは終了せず、代わりに最大スタック深度に達します。これは、else節が常に計算されるためです。

この問題は、一部の言語では遅延評価によって解決されると考えられます。ですから、私の質問は、この無限再帰を持たないfoldの関数バージョンがあるかどうかです。2)必要に応じて、このような単純な言語に遅延評価を適用することについて、どこから考え始めるか。

+1

'if'はSchemeの特殊な形式なので、else式は*常に*評価されません。ここで何が問題なの? –

+0

私はそれがSchemeの場合であることを知っています、そして私は最後の段落で私の質問を明示したと思います。 – zenna

+1

私は最初の質問を理解しません。 2)への答えは、 "特別に"処理すればよい "。 –

答えて

1

if式の両方の分岐をサンクにコンパイルし、条件に基づいて適切なサンクを呼び出すことができます。スキームの正式な定義がそのように書かれていれば、私には驚かないだろう。

2

バインダー(とくにラムダの本体を評価する)の下で評価するのはかなり珍しいと思うので、厳密な言語をlazifyingする標準的な解決法はラムダを導入することです。私はスキーム構文を知らないが、Haskellの構文では、xを厳密な関数fの怠惰なパラメータにしたい場合は、f (\() -> x)のようなものを書くかもしれません(そしてそのようなlambdasを期待するのに適切にfを変更し、あなたがそれらを怠け者にしたい瞬間)。

+0

スキームの構文は、Haskellの構文とかなり似ています。 '(λ()x)'はサンクであり、括弧内のサンクを囲むことはそれを "呼び出し"ます。 '(someThunk)' –

関連する問題