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>
引数...:
#<void>

4

2 に答える 2

19

の結果部分内で 2 つの式を実行しようとしていますが、結果部分でif1ifつの式と代替部分で 1 つの式しか実行できません。

両方の式を括弧で囲むと (あなたが行ったように) うまくいきません: 結果の式は、引数として 2 番目の式を使用して最初の式の関数適用として評価され、エラーが生成"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 に答える