在clojure中使用嵌套函数
我试图创建一个嵌套函数,该函数应该在Clojure中递归运行,以便收集一些信息。 我见过一些技术,比如fn、loop、doseq,但我现在还不擅长 首先,让我解释一下为什么要使用递归函数: 我有一个类,这个类本身包括两个方法,它们分别是getLeft()和getRight(),加上这些方法的返回类型也是一个类。我只想遍历所有getLeft和getRight方法,以便从中获得正确的数目 为了清楚起见,我提出了一个模式: 我的主要班级:在clojure中使用嵌套函数,clojure,nested-loops,Clojure,Nested Loops,我试图创建一个嵌套函数,该函数应该在Clojure中递归运行,以便收集一些信息。 我见过一些技术,比如fn、loop、doseq,但我现在还不擅长 首先,让我解释一下为什么要使用递归函数: 我有一个类,这个类本身包括两个方法,它们分别是getLeft()和getRight(),加上这些方法的返回类型也是一个类。我只想遍历所有getLeft和getRight方法,以便从中获得正确的数目 为了清楚起见,我提出了一个模式: 我的主要班级: +-- getRig
+-- getRight(): class - getLeft/getRight
++ getLeft(): class ---
+-- getLeft((): class - getLeft/getRight
+-- getRight(): class - getLeft/getRight
++ getRight() :class
+-- getLeft((): class - getLeft/getRight
我还创建了一个名为“loopingP”的函数,但当我将此函数添加到另一个函数时,它会给出一个错误。
错误:NullPointerException org.mtrcclojure.demo/loopingP(无源文件:4)
如何在Clojure中正确使用嵌套函数?
提前谢谢
解决方案是:把一个[]
(defn loopingP [points]
(if (= (getKind points) 5)
[ (loopingP (getRight points)) (loopingP (getLeft points))]
(if (= (getKind points) 3) (println "Yep"))))
您的递归用例周围有一组无关的括号-也许您的意思是将getRight和getLeft调用组合成一对?基本情况总是返回nil(来自if的false分支,或者来自println),因此应用最左边的递归,因此您将nil作为函数调用(导致NullPointerException).在您的示例中,
points是什么?points表示AJDT中包含的一个poincut类。如果我从循环p中删除一个嵌套调用,函数将收到一个字符串“Yep”。但是我如何使用两个嵌套调用来表示left和right呢?如果你试图用两个元素构建一个元组,你可以使用向量literal[(loopingP(getRight points))(loopingP(getLeft points))]
。是的,我确实喜欢你的答案@juan.facorro,我现在收到了这个输出:[[5_0]nil]nil]。我怎么能把它们分开?我不知道你说的分开是什么意思。您希望得到的最终结果是什么?另一种方法是将结果展平,然后过滤非零元素:(>>点循环p展平(过滤标识))
。
(defn loopingP [points]
(if (= (getKind points) 5)
[ (loopingP (getRight points)) (loopingP (getLeft points))]
(if (= (getKind points) 3) (println "Yep"))))