Scheme的“期望一个可以应用于参数的过程”

时间:2013-05-08 14:30:16

标签: scheme racket

我使用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)]
      )

但问题仍然存在。

3 个答案:

答案 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]))

在这两种情况下,问题在于,如果用()表达式包围,则表示您正在尝试调用一个过程。并且鉴于上面的ifcond表达式的结果不返回过程,则会发生错误。此外,原始代码中的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))