12

所以这里是代码:

(define (time-prime-test n)
  (newline)
  (display n)
  (start-prime-test n (runtime)))

(define (start-prime-test n start-time)
  (if (prime? n)
      (report-prime (- (runtime) start-time))))

(define (report-prime elapsed-time)
  (display " *** ")
  (display elapsed-time))

(define (search-for-primes n m)
  (if (< n m) 
      ((time-prime-test n)
       (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))
(search-for-primes 100000 100020)

在“计算停止”后出现此错误。已显示。如下所示:

100017 100018 100019 * 54 计算停止。. . 申请:不是程序;期望一个可以应用于给
定参数的过程:#<void>
arguments...:
#<void>

4

2 回答 2

19

您打算在 的后件部分内执行两个表达式if,但if只允许后件中的一个表达式和替代中的一个表达式。

将两个表达式括在括号之间(如您所做的那样)将不起作用:结果表达式将作为第一个表达式的函数应用程序进行评估,第二个表达式作为其参数,产生错误"application: not a procedure; expected a procedure that can be applied to arguments ...",因为(time-prime-test n)不计算过程,它评估为#<void>

您可以使用以下任一方法解决问题cond

(define (search-for-primes n m)
  (cond ((< n m)
         (time-prime-test n)
         (search-for-primes (+ n 1) m))
        (else
         (display " calculating stopped. "))))

begin

(define (search-for-primes n m)
  (if (< n m)
      (begin
        (time-prime-test n)
        (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))
于 2012-08-29T17:20:20.547 回答
3
  ((time-prime-test n)
   (search-for-primes (+ n 1) m))

这将尝试将结果应用time-prime-test为过程。time-prime-test不返回过程。使用begin

  (begin
   (time-prime-test n)
   (search-for-primes (+ n 1) m))
于 2012-08-29T17:12:25.517 回答