Clojure 使用defrecord从另一个命名空间实现协议

Clojure 使用defrecord从另一个命名空间实现协议,clojure,nullpointerexception,protocols,record,Clojure,Nullpointerexception,Protocols,Record,我试图使用defrecord语法从另一个名称空间获取Clojure记录以实现协议,但是调用“满足”会导致空指针异常。代码经过编译,我可以成功地在记录实例上调用协议的方法,只是我不能让“满足”工作。我尝试过使用“extend”而不是在defrecord语法中实现协议,但也遇到了同样的问题 记录(在导入协议的命名空间中): (除记录功能[声明] 可调用 (arity[this](计数(:参数声明))) (调用[此参数] (let[env(env/new environment@globals) 带参

我试图使用defrecord语法从另一个名称空间获取Clojure记录以实现协议,但是调用“满足”会导致空指针异常。代码经过编译,我可以成功地在记录实例上调用协议的方法,只是我不能让“满足”工作。我尝试过使用“extend”而不是在defrecord语法中实现协议,但也遇到了同样的问题

记录(在导入协议的命名空间中):

(除记录功能[声明]
可调用
(arity[this](计数(:参数声明)))
(调用[此参数]
(let[env(env/new environment@globals)
带参数的env
(减少
(fn[env[param参数]]
(env/define pure env(:lexeme param)参数)
环境
(映射向量(:参数声明)参数))]
(执行块(:body声明)env with params)))
对象
(toString[这个]
(str“))
以及另一名称空间中的协议:

(可调用)
(这个)
(调用[此解释器变量参数])
在记录调用中调用“满足”时出错:

      Execution error (NullPointerException) at interpr.interpreter/eval17428$fn (interpreter.clj:164).

              core.clj:  144  clojure.core/instance?
      core_deftype.clj:  536  clojure.core/find-protocol-impl
      core_deftype.clj:  569  clojure.core/satisfies?
      core_deftype.clj:  569  clojure.core/satisfies?
       interpreter.clj:  164  interpr.interpreter/eval17428/fn
          MultiFn.java:  229  clojure.lang.MultiFn/invoke
       interpreter.clj:  176  interpr.interpreter/eval17432/fn
          MultiFn.java:  229  clojure.lang.MultiFn/invoke
       interpreter.clj:  203  interpr.interpreter/eval17457/fn
          MultiFn.java:  229  clojure.lang.MultiFn/invoke
       interpreter.clj:  266  interpr.interpreter/interpret
       interpreter.clj:  261  interpr.interpreter/interpret
              core.clj:   15  interpr.core/run
              core.clj:    9  interpr.core/run
                  REPL:   91  interpr.core/eval17499
……等等

编辑:代码调用满足吗?是:

(defmethod求值调用[expr]
(让[被叫方(求值(:被叫方表达式))
参数(映射求值(:参数expr))]
(续)
(非(满足?可调用被调用方))
(抛出(错误/运行时错误“只能调用函数和类。”(:paren expr)))
(非(=(计数参数)(被调用的算术数)))
(抛出(错误/运行时错误(:paren expr)
(str“预期”(arity被调用方)“参数但得到”(计数参数)”。)
:其他
(调用被调用方解释器参数)

谢谢

您能显示调用
(satisifies?
)的代码吗?
实例?
中的NPE意味着传入的对象是
nil
。我添加了调用的代码?现在到我的岗位。当我试图解决这个问题时,我还确保“被调用方”不是nil,实际上是LoxFunction记录的一个实例。如果
LoxCallable
以某种方式被重新定义为nil值(不是对象),就会出现这个错误。例如:
(满足?nil 1)
。也许您以某种方式覆盖了定义?您能显示调用
(satisifies?
)的代码吗?
实例?
中的NPE意味着传入的对象是
nil
。我添加了调用的代码?现在到我的岗位。当我试图解决这个问题时,我还确保“被调用方”不是nil,实际上是LoxFunction记录的一个实例。如果
LoxCallable
以某种方式被重新定义为nil值(不是对象),就会出现这个错误。例如:
(满足?nil 1)
。也许你不知何故推翻了这个定义?