2016-12-01 3 views
1

私は解決することはできませんよ、符号化クラスの割り当てを持っている:(スキーム/ Drracket、聞かせて使用しないよう、まだ二度同じ機能を評価していない

(define f 
    (lambda (x) 
    (i (g x) (h (g x))))) 

私は、gおよびhは、単に任意の関数名です。 これはコードなので、(g x)は、あらかじめ定義された関数としてdefinelambdaだけを使用してlet(またはその任意の変形)を使用しないで1回だけ評価されるように書き直す必要があります。また、f、つまり、関数内ですべての計算が行われなければなりません。

答えて

2

簡単な方法は

(define f 
    (lambda (x) 
    (define intermediary (g x)) 
    (i intermediary (h intermediary)))) 

で、より複雑では

(define f 
    (lambda (x) 
    ((lambda (intermediary) ; anonymous procedure 
     (i intermediary (h intermediary))) 
    (g x)))) 

または、匿名の手続きを回避し、名前サブ与える次のようになります。

(define f 
    (lambda (x) 
    (define sub 
     (lambda (intermediary) 
     (i intermediary (h intermediary)))) 
    (sub (g x)))) 
+2

授業では、あなたの答えにuselpaを付けてください! –

2

をおかしいどのようにletのバリアントは使用できませんが、definelambdaが許可されています。私は確かにlet(またはその逆)の真の変種です。

(let ((v1 expr1) ...) 
    body ...) 

((lambda (v1 ...) 
    body ...) expr1 ...) 

と同じであるので、letしたがって.. lambdaの変種です:

(define f 
    (lambda (x) 
    (let ((gx (g x))) 
     (i gx (h gx))))) 

もちろんの缶はに書き換えられる:

(define f 
    (lambda (x) 
    ((lambda (gx) 
     (i gx (h gx))) 
    (g x)))) 

今度は(define f ..)の前に他のフリー変数を定義するとします。それはに書き換えることができます。

((lambda (i) 
    ((lambda (h) 
     ((lambda (g) 
     ((lambda (f) 
      rest-of-program ...) 
      (lambda (x) 
      ((lambda (gx) 
       (i gx (h gx))) 
      (g x))))) 
     (lambda (v) g-expression))) 
    (lambda (v) h-expression))) 
(lambda (v1 v2) i-expression)) 

実際に閉鎖ですが、プリミティブのために、この作品でさらにあったことが結合を持つために必要なバインド変数の1つが実際の展開は少し複雑かもしれません。

関連する問題