我得到了“方案的应用不能在一个过程”在一个函数的递归最后调用(I got “scheme appli

2019-06-17 21:57发布

所以这里是代码:

(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计算停止。 。 。 应用:不是一个程序; 预期可应用于参数的过程
下式给出:#<空隙>
参数...:
#<空隙>

Answer 1:

您打算执行的事件部分内两个表达式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. ")))


Answer 2:

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


文章来源: I got “scheme application not a procedure” in the last recursive calling of a function