Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

I got "scheme application not a procedure" in the last recursive calling of a function

so here is the code:

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

and i got this error after "calculating stopped." has been displayed. like below:

100017 100018 100019 * 54 calculating stopped. . . application: not a procedure; expected a procedure that can be applied to arguments
given: #<void>
arguments...:
#<void>

like image 903
tuo Avatar asked Aug 29 '12 17:08

tuo


2 Answers

You intend to execute two expressions inside the consequent part of the if, but if only allows one expression in the consequent and one in the alternative.

Surrounding both expressions between parenthesis (as you did) won't work: the resulting expression will be evaluated as a function application of the first expression with the second expression as its argument, producing the error "application: not a procedure; expected a procedure that can be applied to arguments ...", because (time-prime-test n) does not evaluate to a procedure, it evaluates to #<void>.

You can fix the problem by either using a cond:

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

Or a begin:

(define (search-for-primes n m)
  (if (< n m)
      (begin
        (time-prime-test n)
        (search-for-primes (+ n 1) m))
      (display " calculating stopped. ")))
like image 141
Óscar López Avatar answered Nov 05 '22 11:11

Óscar López


  ((time-prime-test n)
   (search-for-primes (+ n 1) m))

This will try to apply the result of time-prime-test as a procedure. time-prime-test doesn't return a procedure. Use begin:

  (begin
   (time-prime-test n)
   (search-for-primes (+ n 1) m))
like image 44
hzap Avatar answered Nov 05 '22 10:11

hzap