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,欢迎你!请考虑一下对你最有帮助的答案,点击左边的检查标记。