【发布时间】:2013-02-10 18:29:37
【问题描述】:
我正在尝试输出前 100 个素数并不断收到错误:
应用程序:不是程序; 期望一个可以应用于参数的过程 给定:(#) 参数...:[无]
错误显示在我的 take$ 过程中:
(if (or (= m 0) (null? st))
'()
(cons (car st) (take$ (- m 1) ((cdr st)))))))
这是我所有的代码:
(define int-builder$
(lambda (x)
(list x (lambda () (int-builder$ (+ 1 x ))))))
(define take$
(lambda (m st)
(if (or (= m 0) (null? st))
'()
(cons (car st) (take$ (- m 1) ((cdr st)))))))
(define filter-out-mults$
(lambda (num st)
(cond
(( = (remainder (car st) num) 0)
(filter-out-mults$ num ((cadr st))))
(else
(list (car st) (lambda () (filter-out-mults$ num ((cadr st)))))))))
(define sieve$
(lambda (st)
(list (car st)
(lambda() (sieve$ (filter-out-mults$ (car st) ((cadr st))))))))
(define stol$
(lambda (n)
(take$ n (sieve$ (int-builder$ 2)))))
感谢您提供的任何帮助。
【问题讨论】:
-
((cdr st))看起来很可疑 -
它只是看起来可疑,作者的意图是在 cdr 中调用闭包。看起来更可疑的是
((cadr st))。 -
take$ 过程中显示错误。
-
@AntonKovalenko:不完全是,这些实际上看起来并不那么可疑。查看
(list ... (lambda ... )),它对((cadr st))应用程序有效。 -
cmets 中的一些 data definitions in comments and corresponding contracts 对您的函数可能有所帮助。我现在正在构建一些(通过手动类型推断)。
标签: scheme primes lazy-sequences sieve non-procedure-application