私は自動プログラム合成のための単純な関数言語を実装しようとしています。 データ構造は関数と値のグラフで、javascriptにコンパイルされます。 次のグラフは折り畳み機能です。 funcApp
ノードは、関数ノードといくつかの値ノードに接続され、値に関数を適用します。 arg0
がリスト、arg1
が初期値(z)arg2
が適用される関数です。怠惰な評価なしで単純な純関数言語でfoldを実装する
それは
(define (foldr f z xs)
(if (null? xs)
z
(f (car xs) (foldr f z (cdr xs)))))
問題が特別な存在しないので、あるということです(私の「言語」はスキームではないが、それはグラフがある)folloiwngスキームの定義に相当します演算子、すべて、特にif
は単なる正常な関数です。この形式では、プログラムは終了せず、代わりに最大スタック深度に達します。これは、else節が常に計算されるためです。
この問題は、一部の言語では遅延評価によって解決されると考えられます。ですから、私の質問は、この無限再帰を持たないfoldの関数バージョンがあるかどうかです。2)必要に応じて、このような単純な言語に遅延評価を適用することについて、どこから考え始めるか。
'if'はSchemeの特殊な形式なので、else式は*常に*評価されません。ここで何が問題なの? –
私はそれがSchemeの場合であることを知っています、そして私は最後の段落で私の質問を明示したと思います。 – zenna
私は最初の質問を理解しません。 2)への答えは、 "特別に"処理すればよい "。 –