我有这个程序:
(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。
答案 0 :(得分:3)
如果你没有围绕lambda参数的括号,那么你得到列表中的所有参数。因此,您的代码将“多少次调用与列表进行比较。”
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"
答案 1 :(得分: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))))))
特别注意:
lambda
的参数不被括号括起来(与char
的情况一样),则该过程需要列表具有可变大小的参数,可能为空(car char)
提取参数,如果提供了参数begin
中的条件之后没有必要使用cond
,它是隐含的使用以下程序:
(count-calls)
=> 1
(count-calls 'how-many-calls)
=> 1
(count-calls 'reset)
=>
(count-calls 'how-many-calls)
=> 0
答案 2 :(得分:1)
扩展stchang的答案,这是解决这个问题的一种方法:
(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?))))))