[英]DrRacket:application: not a procedure Error on R5RS language
这是我在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
参数...:
所以,我想知道是否有人可以帮助我解决问题。 编辑
我怀疑有一个语法错误,如上面的误用或未对齐的paranthesis但我找不到导致错误的确切位置。
使用apply-method
, in-object
值为#f
。 当apply-method
尝试做(get-method message in-object)
get-method
然后应用(in-object message)
变成(#f 'some-unknown-message)
并且因为#f
不是一个过程球拍将其视为一个问题,最后会出现一个错误,告诉您在应用程序中,给定值#f
不是一个过程。
既然你正在使用racket,也许你应该启动调试器并在get-method
上设置一个断点,你会看到它。 请注意,Scheme和Racket语言只有一个名称空间用于所有绑定,因此您不能使用相同名称的过程和变量,因为命名过程将占用相同的变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.