这是我学习Dr.Racket和R5RS语言的第一天。我正在尝试修改下面共享的现有代码。
;; 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:应用程序:不是一个过程,而是一个可以应用于参数的过程 给予:#f 论点.

所以,我想知道有没有人能帮我解决这个问题。编辑
我怀疑上面有一个语法错误,比如误用或不对齐的偏执,但我找不到引起错误的确切位置。
发布于 2016-12-04 21:51:15
当您使用apply-method时,in-object的值是#f。当apply-method尝试执行(get-method message in-object) get-method时,然后应用(in-object message)将其转化为(#f 'some-unknown-message),并且由于#f是而不是,过程racket在将其作为处理时遇到问题,并最终导致一个错误,告诉您在应用程序期间,给定值#f不是一个过程。
由于您使用的是球拍,也许您应该启动调试器并在get-method上放置一个断点,您将看到它。请注意,Scheme和Racket语言对于所有绑定只有一个命名空间,因此您不能使用相同名称的过程和变量,因为命名过程将占用相同的变量。
https://stackoverflow.com/questions/40963048
复制相似问题