Reputation: 1828
I use DrRacket. I have problem with this code:
(define (qweqwe n) (
(cond
[(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f]
)
)
)
(define ( RTY file1 file2 )
(define out (open-output-file file2 #:mode 'text #:exists 'replace))
(define in (open-input-file file1))
(define (printtofile q) (begin
(write q out)
(display '#\newline out)
))
(define (next)
(define n (read in))
(cond
[(equal? n eof) #t]
[else (begin
((if (qweqwe n) (printtofile n) #f))
) (next)]
)
)
(next)
(close-input-port in)
(close-output-port out))
But when I start ( RTY "in.txt" "out.txt" ) I have an error at ((if (qweqwe n) (printtofile n) #f)) :
application: not a procedure;
expected a procedure that can be applied to arguments
given: #f
arguments...: [none]
What's the problem?
ADD: I changedmy code to:
(cond
[(equal? n eof) #t]
[else
(if (qweqwe n) (printtofile n) #f)
(next)]
)
But the problem remains.
Upvotes: 8
Views: 40959
Reputation: 70235
Before considering the correctness of an algorithm, one must get the code to be syntactically correct - that is, it must compile. One of the beautiful aspect of Scheme programming is that the interactive environment allows one to easily compile and evaluate a program.
Your code either won't compile or won't run because you have a number of syntactic errors. Here is your syntactically correct (based on my guess as to the desired behavior) code. In part I arrive at syntactic correctness by rigorously formatting the code:
(define (qweqwe n)
(cond
[(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f]))
(define (RTY file1 file2 )
(define out (open-output-file file2 #:mode 'text #:exists 'replace))
(define in (open-input-file file1))
(define (printtofile q)
(write q out)
(display '#\newline out))
(define (next)
(define n (read in))
(cond
[(equal? n eof) #t]
[else
(if (qweqwe n) (printtofile n) #f)
(next)]))
(next)
(close-input-port in)
(close-output-port out))
Upvotes: -1
Reputation: 236142
There are some unnecessary parenthesis, don't do this:
((if (qweqwe n) (printtofile n) #f))
Try this instead:
(if (qweqwe n) (printtofile n) #f)
Also in here:
(define (qweqwe n)
((cond [(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f])))
It should be:
(define (qweqwe n)
(cond [(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f]))
In both cases the problem was that if you surround with ()
an expression, it means that you're trying to invoke a procedure. And given that the result of the if
and cond
expressions above don't return a procedure, an error occurs. Also, bothbegin
s in your original code are unnecessary, a cond
has an implicit begin
after each condition, same thing for the body of a procedure definition.
Upvotes: 16
Reputation: 5919
You have a double set of parentheses:
((if (qweqwe n) (printtofile n) #f))
This means that Scheme first evaluates this:
(if (qweqwe n) (printtofile n) #f)
Then it expects this to evaluate to a function, call it g, which it evaluates like this:
(g)
Since your conditional form does not return a function, you probably meant to just use a single set of parentheses.
Upvotes: 1