我有这个程序:
(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。
最佳答案
如果您在 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"
关于 Racket 中的剩余参数,零或一个参数程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15009783/