1. ホーム
  2. scheme

[解決済み】Schemeの "引数に適用可能な手続きを期待"

2022-01-27 18:35:13

質問

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 "in.txt" "out.txt" )を開始すると、私は((もし(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)]
      )

しかし、問題は残ります。

どうすればいい?

不要な括弧がありますが、これはやめてください。

((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 は、各条件の後で、プロシージャの定義の本文でも同じです。