2

我一直在尝试通过“计算机程序的结构和解释”这本书来学习编程。为了做我一直在使用 DrRacket 的练习(我找不到 Windows 7 的方案解释器,而且 DrRacket 看起来不错),并且到目前为止还没有遇到任何问题。但是在做练习 1.22 时我遇到了一个问题。我编写了一个程序,它给出了一个大于a的素数的给定数量( n ) :

(define (search-for-primes a n)
  (define (sfp-iter a n counter)
    (cond ((and (prime? a) (= counter n))
           ((newline) (display "end")))
          ((prime? a)
           ((newline)
            (display a)
            (sfp-iter (+ a 1) n (+ counter 1))))
          (else (sfp-iter (+ a 1) n counter))))
  (sfp-iter a n 0))

该过程按预期工作,显示它应该显示的所有内容,但在显示结束后它显示以下错误消息:

申请:不是程序;期望一个可以应用于给定参数的过程:# arguments...:#

并突出显示以下代码行:

((newline) (display "end"))

问题是什么?(我为任何拼写错误道歉,所以英语不是我的母语,我也为格式或标记中的任何错误道歉,我是新来的)

4

1 回答 1

4

你有几个括号问题,这解决了它:

(define (search-for-primes a n)
  (define (sfp-iter a n counter)
    (cond ((and (prime? a) (= counter n))
           (newline) (display "end"))
          ((prime? a)
           (newline)
           (display a)
           (sfp-iter (+ a 1) n (+ counter 1)))
          (else (sfp-iter (+ a 1) n counter))))
  (sfp-iter a n 0))

在 的第一个和第二个条件中cond,您错误地用 . 包围了代码()。这是不必要的,在一个cond子句中,条件之后的所有表达式都被一个(begin ...)表单隐式包围,因此无需将它们组合在一起。

于 2013-04-06T21:15:16.193 回答