过程按预期工作,但仍显示错误消息

时间:2013-04-06 20:53:45

标签: lisp scheme racket sicp

我一直在尝试使用“计算机程序的结构和解释”一书来学习编程。为了练习我一直在使用DrRacket(我找不到适用于Windows 7的计划解释器,DrRacket看起来相当不错),到目前为止还没有任何问题。但是在进行练习1.22时我遇到了一个问题。我写了一个程序,给出一个给定数字( n )的素数更大比 a

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

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

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

并突出显示以下代码行:

((newline) (display "end"))

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

1 个答案:

答案 0 :(得分: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 ...)形式隐式包围,因此不需要将它们组合在一起。