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)
                 ((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/

相关文章:

ruby - 如何在 Ruby 中发送 HTTP PUT 请求?

c# - 如何使用 REST api 将新文档添加到 Content Server 10.5

lisp - 奇怪的路径名?

lisp - SICP中的一个例子

python - 解压 map() 参数的嵌套列表

java - 使用 Android 连接到 Neo4J

java - 在 Eclipse 中使用 Java 创建 REST 服务

recursion - 编写一个递归 LISP 函数,计算两个相同长度数字列表的点积

python - 从 py 创建 exe,它在执行时默认通过argumt?

c# - 在 gridview 中的 asp.net 按钮中传递多个参数