2

私はこの手順を持っています:

(define count-calls
  (let ((count 0))
    (lambda char  
           (cond ((null? char) 
                  (begin(set! count (+ 1 count))
                        count))
                 ((eq? char 'how-many-calls) count)
                 ((eq? char 'reset) (set! count 0))))))

(count-calls)が呼び出されると1が加算されますが、(count-calls'how-many-calls)を呼び出すと、意図したとおりに機能しません。(lambda charの代わりに(lambda(char))を定義すると、(eq?...)の部分が見つかりますが、(lambda char)の場合はcharを認識しないようです。

4

3 に答える 3

3

ラムダ パラメータを括弧で囲んでいない場合は、リスト内のすべての引数を取得します。したがって、コードは「呼び出し回数」をリストと比較しています。

Welcome to DrRacket, version 5.3.3.5 [3m].
Language: racket [custom]; memory limit: 8192 MB.
> ((lambda args (displayln args)) "a")
(a)
> ((lambda args (displayln args)) "a" "b")
(a b)
> ((lambda (args) (displayln args)) "a")
a
> ((lambda (args) (displayln args)) "a" "b")
#<procedure>: arity mismatch;
 the expected number of arguments does not match the given number
  expected: 1
  given: 2
  arguments...:
   "a"
   "b"
于 2013-02-21T18:49:56.557 に答える
3

コーディング エラーがいくつかありますが、これで修正されるはずです。

(define count-calls
  (let ((count 0))
    (lambda char
      (cond ((null? char) 
             (set! count (+ 1 count))
             count)
            ((eq? (car char) 'how-many-calls)
             count)
            ((eq? (car char) 'reset)
             (set! count 0))))))

特に、次の点に注意してください。

  • alambdaのパラメーターが( の場合のように) 括弧で囲まれていない場合、プロシージャーは可変サイズの引数のリストcharを予期します。おそらく空です。
  • (car char)それを念頭に置いて、パラメーターが提供されている場合、パラメーターを抽出するために行う必要がある理由は明らかです
  • beginの条件の後に aを使用する必要はありませんcond。暗黙的です。

次のような手順を使用します。

(count-calls)
=> 1
(count-calls 'how-many-calls)
=> 1
(count-calls 'reset)
=> 
(count-calls 'how-many-calls)
=> 0
于 2013-02-21T18:58:36.163 に答える
1

stchangの答えを拡張すると、これを解決する1つの方法があります:

(define count-calls
  (let ((count 0))
    (case-lambda
      (() (set! count (+ 1 count)) count)
      ((char) (cond
                ((eq? char 'how-many-calls) count)
                ((eq? char 'reset ) (set! count 0) 'reset)
                (else 'wot?))))))
于 2013-02-21T19:02:56.853 に答える