4

複数のラムダを使用するスキームのコードがあります。基本的には中間の数値を返します。

(define foo
  (lambda (x)
    (letrec
      ((h (lambda (y z)
        (cond
          ((null? y) 'undefined)
          ((null? (cdr y)) (car z))
          (else (h (cddr y) (cdr z)))))))
  ((lambda (y) (h y y)) x))))

ラムダを使用しないようにコードを書き直す必要があります。それ、どうやったら出来るの?

4

2 に答える 2

4

式のすべてのラムダを削除するには、次のようにします。

  • プロシージャ定義を次の形式(define f (lambda (x) x))から次の同等の形式に置き換えます。(define (f x) x)
  • letrec式を内部定義に置き換えます
  • 最後の行の を別の内部定義に置き換えlambda、名前を付けて最後に呼び出します
  • lambdaさらに簡単:を直接呼び出すのと同じように、 last は実際には必要ないことに注意してください。(h x x)

上記の各置換を連続して適用すると、手順は次のようになります。

(define (foo x)
  (define (h y z)
    (cond
      ((null? y) 'undefined)
      ((null? (cdr y)) (car z))
      (else (h (cddr y) (cdr z)))))
  (h x x))

lambdas は実際には削除されていないことに注意してください。それらはまだボンネットの下にあり、構文糖衣の後ろに隠されています。

于 2012-06-02T13:56:34.343 に答える
2

それは文脈とあなたが教えられたことに依存します。より多くのコンテキストを投稿すると、より良い回答が得られる可能性が高くなります。

ただし、最初に注意してください。

(define (foo x) (+ x 1)) 

と同等です

(define foo (lambda (x) (+ x 1))).

それを取り除くにはletrec、内部定義に書き直してください。

于 2012-06-02T11:00:34.657 に答える