clojure - 简化函数输出不完全符合预期

标签 clojure expression simplify

我正在尝试编写一个函数来简化任意 bool 表达式列表,但我的函数未通过某些测试。

  (defn sim
  [expression]
  (if (some true? expression)
    true
    (if (= (count expression) 2)
      (if (some false? expression)
        false
        (if (map simple-symbol? expression)
          (if (= (count expression) 2)
            (drop 1 expression)
            expression)))
      (if (some simple-symbol? (drop 1 expression))
        (filter simple-symbol? expression)))))

当我使用 (sim '(or x false)) 调用时,我希望输出为 (x),但它返回 (or x )。相反,当我使用 (sim '(or x)) 调用时,我的输出是预期的 (x)

最佳答案

按照这些思路怎么样?这仅适用于 or,但我相信我们可以为 and 和其他 bool 运算符做同样的事情。

(defn simplify-or [exp]
  (let [op (first exp)
        args (rest exp)]
    (when (= op 'or)
      (let [nf-args (filter #(symbol? %) args)]
        (if (some true? args)
          true
          (case (count nf-args)
            0 false
            1 (first nf-args)
            (concat (list op) nf-args)))))))

结果:

(simplify-or '(or false))       
=> false

(simplify-or '(or true))       
=> true

(simplify-or '(or x true y false))       
=> true

(simplify-or '(or x y false))       
=> (or x y)

关于clojure - 简化函数输出不完全符合预期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52528267/

相关文章:

clojure - 解构 map 向量

delphi - 三重等式表达式求值

sql - 这个sql查询可以简化吗?

R 简化 shapefile

optimization - GPS轨迹的简化/优化

clojure - 在 Clojure/Clojurescript 项目中,在 "shadow-cljs.edn"和 "deps.edn"文件上声明依赖项是否有意义?

dictionary - 如何在不知道 Clojure 中的键的情况下将映射分解为键值对?

clojure - 在 Clojure 中将数字从 10 进制转换为另一个进制

r - 为什么不能计算表达式中的这个 R 调用对象? (子集与从调用对象中提取)

sql - ASP MVC Lambda 表达式或查询扩展?