在球拍中休息参数,零或一个参数程序

时间:2013-02-21 18:35:18

标签: 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)
                 ((eq? char 'reset) (set! count 0))))))

当调用(count-calls)时会添加1,但是当我调用(count-calls'how-many-calls)时,它不会按预期工作。我发现如果你定义(lambda(char)而不是(lambda char,(eq?...)部分被找到但是(lambda char)它似乎不识别char。

3 个答案:

答案 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?))))))