关于scheme:DrRacket:application:不是过程R5RS语言上的错误

DrRacket:application: not a procedure Error on R5RS language

这是我使用Dr.RacketR5RS语言的第一天。我正在尝试修改我在下面共享的现有代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
;; This is an internal helper procedure.
;;  - it gets the method out of"in-object"
;;  - it invokes the method, passing"for-object" as the
;;   "self" for the method.                    
;;                  
(define (apply-method in-object for-object message args)
  (let ((method (get-method message in-object)))
    (cond ((method? method)                
           (apply method for-object args))
          ((eq? in-object for-object)
       (display method)                
           (error"No method for" message 'in
          (safe-ask 'UNNAMED-OBJECT
                in-object 'NAME)))
          (else (error"Can't delegate" message
                      "from" (safe-ask 'UNNAMED-OBJECT
                    for-object 'NAME)
              "to" (safe-ask 'UNNAMED-OBJECT
                      in-object 'NAME))))))


(define (get-method message object) ; single-inheritance
  (object message))

此代码段是相当庞大的项目的一部分。因此,我仅分享相关部分。在项目内部,调用此apply-method过程。以let表达式开头的行出现错误。错误消息如下:

objsys.scm:53:2: application: not a procedure; expected a procedure
that can be applied to arguments
given: #f
arguments...:

error

所以,我想知道是否有人可以帮助我解决问题。
编辑

我怀疑上面有一个语法错误,如误用或未对齐的括号,但我找不到导致错误的确切位置。


使用apply-method时,in-object的值是#f。当apply-method尝试执行(get-method message in-object) get-method时,将应用(in-object message)转换为(#f 'some-unknown-message),并且由于#f不是过程球拍,将球拍视为一个球会出现问题,并最终出现错误,告诉您应用程序给定值#f不是过程。

由于您使用的是球拍,也许您应该只启动调试器并将断点放在get-method上,您会看到它。请注意,Scheme和Racket语言对于所有绑定都只有一个命名空间,因此您不能拥有一个具有相同名称的过程和变量,因为命名过程将占用完全相同的变量。