0

私はスキームに機能を持っています

    (define (m-m f)
      (let ((count 0))
      (define (h-m-c?) count)
      (define (r-c) (begin (set! count 0) count))
      (define (m-f m)
        (cond ((eq? m 'h-m-c?) (h-m-c))
              ((eq? m 'r-c) (r-c))
              (else (set! count (+ 1 count)) f)))
      m-f))

ここで、mf は返される関数です。

ただし、値を返すのではなく、

    #<procedure:m-f>

コードにエラーがないように見えるのに、なぜこれが使用可能な値を返さないのでしょうか?

4

1 に答える 1

2

戻るように言いましたm-f。これは、定義したプロシージャの名前であるため、プロシージャが返されます。この戻り値を使用するには、それを別の変数に割り当てる必要があります。

(define thing1 (m-m 'unused))
(define thing2 (m-m 'who-cares))
(thing1 'h-m-c?)
(thing1 'increment)
(thing1 'h-m-c?)
(thing2 'h-m-c?)

その他のコメント:

で終わるプロシージャ名?は、真/偽を報告する述語に使用されます。

必要ありませbegin(r-c)。手続き本体は複数の式を許可し、 のように順番に実行しますbegin

count他のケースで行ったように、がインクリメントされるケースの関数を定義しなかったのはなぜですか?

mインクリメントにデフォルトを使用するのは不適切なようです。これには特定のパラメーターが必要です。

fパラメータの目的は何ですか? それが使用される唯一のことは、インクリメント時に返されることですか? の新しい値はcount、より有用な戻り値ではないでしょうか? インスタンスの「名前」を意図しているようです。その場合は、インクリメント時にこれを行うのではなく、おそらく名前を返す新しい操作を追加する必要があります。

編集:

以下の回答に基づいて、fパラメーターを誤用していると思われます。おそらく、インクリメントを行うときに呼び出す関数であるはずです。したがって、それをラムダ式として提供し、(f)単なる ではなく返す必要がありますf

于 2012-10-02T06:18:14.510 に答える