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
Recursion 使用嵌套输入,但不将其展平_Recursion_Clojure - Fatal编程技术网

Recursion 使用嵌套输入,但不将其展平

Recursion 使用嵌套输入,但不将其展平,recursion,clojure,Recursion,Clojure,我有一个函数可以简化如下内容: (or x false) => x 然后,函数定义将未赋值表达式作为其参数。 我正在尝试按如下方式嵌套输入: (or x (and true)) 我到处都能看到关于展平嵌套输入的文章,但在这种情况下这不起作用,因为每个列表的开头都有逻辑运算符,所以必须首先处理最里面的列表,并将结果作为参数发送到下一个外部列表 我知道我需要用最里面的列表的结果调用它自己体内的函数,直到我到达最外面的列表,但我不确定该怎么做,也不确定该在Clojure中研究什么来实现这一点

我有一个函数可以简化如下内容:

(or x false) => x
然后,函数定义将未赋值表达式作为其参数。 我正在尝试按如下方式嵌套输入:

(or x (and true))
我到处都能看到关于展平嵌套输入的文章,但在这种情况下这不起作用,因为每个列表的开头都有逻辑运算符,所以必须首先处理最里面的列表,并将结果作为参数发送到下一个外部列表


我知道我需要用最里面的列表的结果调用它自己体内的函数,直到我到达最外面的列表,但我不确定该怎么做,也不确定该在Clojure中研究什么来实现这一点。

您所描述的几乎就是Clojure中表达式求值的语义:-),所以简单的答案是运行代码:-D,尽管我怀疑您正在寻找一个更有趣的答案

下面是一个简单的递归版本,通过

  • 递归地简化每个嵌套表达式
  • 将简化规则应用于现有表达式
  • 这使用了一个过于简单的规则作为示例:

    user> (defn my-eval [e]      
            (let [expanded-form (if (seq? e)
                                  (map (fn [i]          
                                         (if (seq? i)    ;; if this is a sequence, 
                                           (my-eval i) ;; eval the sequence and include the result here
                                           i))         ;; otherwise use the value unchanged.
                                       e)
                                  e)] ;; if it's not a seq with something in it, leve it unchanged
              (if (and
                   (seq? expanded-form)
                   (= (first expanded-form) 'or)
                   (= 2 (count (remove false? expanded-form))))
                (second (remove false? expanded-form))
                expanded-form)))
    #'user/my-eval
    
    首先是基本情况测试:

    user> (my-eval '(or x (or y false)))
    (or x y)
    
    然后通过一点递归:

    user> (my-eval '(or (or x false) (or y false)))
    (or x y) 
    
    看看哪一个允许您对数据进行深度优先遍历,同时可以选择对其进行转换。请在您的输入上尝试
    postwark demo
    ,以获取示例。