我正在尝试使用clojure spec的简单函数,该函数计算方阵中(行,列)位置的“邻居”。例如,对于下面给出的4x4矩阵,像元(1,1)的邻居应为:(0,1),(1,0),(1,2),(2,1)。甚至不在矩阵范围内的像元(4,3)的邻居应该是(3,3)等。
函数的输入是矩阵的大小和感兴趣位置的(行,列)。输出是邻居(行,列)的集合。如果没有邻居,则此集合可以为空。
此问题可以在“ Clojure的喜悦,第二版,第94页;中找到;但是由于原始代码对我来说太紧凑,所以对代码进行了修改。然后,我尝试对其进行规范并检查{{1 }}和:pre
部分。
但是,我无法使用:post
部分。运行测试用例时,我得到:
:post
要更改什么?
java.lang.ClassCastException: java.lang.Boolean cannot be cast
to clojure.lang.IFn
答案 0 :(得分:1)
您只是缺少#
前缀以使匿名功能处于:post
条件。后置条件必须是一个可以获取主题函数调用输出的函数。
:post [#(s/valid? ::be-row-col-vector %)]
也可以改写为:
:post [(fn [o] (s/valid? ::be-row-col-vector o))]
但是根据您的用例,您可能希望研究function specs和instrument
作为:pre
和:post
条件的替代方法。我写了更多examples here.