1

Schemeで呼び出された回数を返す関数は次のようになります。

(define count
  (let ((P 0))
    (lambda () 
      (set! P (+ 1 P))
      P)))

(list (count) (count) (count) (count)) ==> (list 1 2 3 4)

しかし、次のような式があるとします。

(map ______ lst)

そして私たちはそれを評価したい

(list 1 2 3 ... n)
where n = (length list)

この問題では、空白でラムダステートメントを使用する必要があり、空白で(count)のような補助定義を使用できないため、

(lambda (x) (count))

許可されていません。(カウント)を次のような前の定義に置き換えるだけです。

(map
 (lambda (x)
   ((let ((P 0))
      (lambda () 
        (set! P (+ 1 P))
        P))))
 L)

どちらも機能しません。

助言がありますか?

4

3 に答える 3

1

あなたはそこへの道の90%です。定義の右側をcount空白で使用し、(無視された)引数を関数に追加します。

于 2013-01-11T02:05:03.067 に答える
1

あなたは正しい解決策に非常に近いです!質問のコードでこれを行うだけです:

  1. 最も外側lambdaが間違っています。その行と対応する閉じ括弧を削除してください
  2. 最も内側lambdaは、最終的にmapプロシージャに渡されるものであるため、パラメータを受け取る必要があります(実際には使用されていませんが)。
  3. letフォームを囲む最も外側の括弧を削除します

つまり、パラメータを受け取るためlambdaに渡されるだけでなく、変数を囲みます。フォームは、渡されたのコンテキストで1回だけ定義し、その時点から、リスト内の各要素に同じ値が使用されるため、の値を「記憶」します。mapPletPlambdalambdaPP

于 2013-01-11T02:41:24.507 に答える
-2
(define add-stat-var
    
    (let ( (P '()) )
        (lambda (x1) 
            (if (equal? x1 "ResetStatVar") (set! P '()) (set! P (cons x1 P)))
        P
        ) ;lambda
      
    ) ;let
      
) ;define

(define (test-add-stat-var x)

    (let* ( (result '()) )
    
            (set! result (add-stat-var 12))
            (set! result (add-stat-var 14))
            (set! result (add-stat-var 16))
            
            (display (add-stat-var x)) (newline)
            
            (set! result (add-stat-var "ResetStatVar"))
            
            (display (cdr (add-stat-var x))) (newline)

    )
    
)
于 2022-01-09T11:17:51.470 に答える