Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在clojure中使用嵌套函数_Clojure_Nested Loops - Fatal编程技术网

在clojure中使用嵌套函数

在clojure中使用嵌套函数,clojure,nested-loops,Clojure,Nested Loops,我试图创建一个嵌套函数,该函数应该在Clojure中递归运行,以便收集一些信息。 我见过一些技术,比如fn、loop、doseq,但我现在还不擅长 首先,让我解释一下为什么要使用递归函数: 我有一个类,这个类本身包括两个方法,它们分别是getLeft()和getRight(),加上这些方法的返回类型也是一个类。我只想遍历所有getLeft和getRight方法,以便从中获得正确的数目 为了清楚起见,我提出了一个模式: 我的主要班级: +-- getRig

我试图创建一个嵌套函数,该函数应该在Clojure中递归运行,以便收集一些信息。 我见过一些技术,比如fn、loop、doseq,但我现在还不擅长

首先,让我解释一下为什么要使用递归函数: 我有一个类,这个类本身包括两个方法,它们分别是getLeft()和getRight(),加上这些方法的返回类型也是一个类。我只想遍历所有getLeft和getRight方法,以便从中获得正确的数目

为了清楚起见,我提出了一个模式:

我的主要班级:

                     +-- 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"))))