我正在尝试编写一个函数来简化任意 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/