我使用DrRacket。我对此代码有疑问:
(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))
但是当我开始时(RTY&#34; in.txt&#34;&#34; out.txt&#34;)我有一个错误((if(qweqwe n)(printtofile n)#f)) :
application: not a procedure;
expected a procedure that can be applied to arguments
given: #f
arguments...: [none]
问题是什么?
ADD:我将代码更改为:
(cond
[(equal? n eof) #t]
[else
(if (qweqwe n) (printtofile n) #f)
(next)]
)
但问题仍然存在。
答案 0 :(得分:10)
有一些不必要的括号,不要这样做:
((if (qweqwe n) (printtofile n) #f))
请改为尝试:
(if (qweqwe n) (printtofile n) #f)
也在这里:
(define (qweqwe n)
((cond [(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f])))
应该是:
(define (qweqwe n)
(cond [(< n 10) #t]
[(>= (lastnum n) (pochtilastnum n)) (qweqwe (quotient n 10))]
[else #f]))
在这两种情况下,问题在于,如果用()
表达式包围,则表示您正在尝试调用一个过程。并且鉴于上面的if
和cond
表达式的结果不返回过程,则会发生错误。此外,原始代码中的begin
都是不必要的,cond
在每个条件后都有隐式begin
,对于过程定义的主体也是如此。
答案 1 :(得分:1)
你有两套括号:
((if (qweqwe n) (printtofile n) #f))
这意味着Scheme首先对此进行评估:
(if (qweqwe n) (printtofile n) #f)
然后它希望这个计算到一个函数,称之为g,它的评估结果如下:
(g)
由于您的条件表单不返回函数,您可能只想使用一组括号。
答案 2 :(得分:0)
在考虑算法的正确性之前,必须使代码在语法上正确 - 也就是说,必须编译。 Scheme编程的一个美妙方面是交互式环境允许人们轻松编译和评估程序。
您的代码将无法编译或无法运行,因为您有许多语法错误。这是你的语法正确(基于我对所需行为的猜测)代码。在第一部分中,我通过严格格式化代码来达到句法正确性:
(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))