Rest 剩余参数,racket中的零参数或一参数程序
我有以下程序:Rest 剩余参数,racket中的零参数或一参数程序,rest,lisp,arguments,scheme,racket,Rest,Lisp,Arguments,Scheme,Racket,我有以下程序: (define count-calls (let ((count 0)) (lambda char (cond ((null? char) (begin(set! count (+ 1 count)) count)) ((eq? char 'how-many-calls) count) ((
(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“多少个调用”)时,它不会按预期工作。我发现,如果定义(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"
欢迎使用DrRacket,版本5.3.3.5[3m]。
语言:racket[自定义];内存限制:8192MB。
>((lambda参数(displayln参数))“a”)
(a)
>((lambda参数(displayln参数))“a”“b”)
(a)b)
>((lambda(args)(displayln args))“a”)
A.
>((lambda(args)(displayln args))“a”“b”)
#:算术不匹配;
参数的预期数量与给定数量不匹配
预期:1
给定:2
论据。。。:
“a”
“b”
您有几个编码错误,这应该可以修复它们:
(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)
- 在
中的条件之后,不必使用cond
,它是隐式的begin
(count-calls)
=> 1
(count-calls 'how-many-calls)
=> 1
(count-calls 'reset)
=>
(count-calls 'how-many-calls)
=> 0
扩展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?))))))
多谢。我想试一下(Car Char),因为我看到查尔是我的一个清单。@ HenrikAndersson,欢迎你!请考虑一下对你最有帮助的答案,点击左边的检查标记。