如何从列表中删除+-/ *之类的运算符

时间:2019-02-03 18:40:31

标签: clojure

如何检查列表是否包含运算符?我正在尝试从列表中过滤掉运算符。

例如,(func '(= a (* b c)))应该返回(a b c)

我尝试过symbol?,但这使运算符不在列表中

2 个答案:

答案 0 :(得分:3)

您可以使用简单的哈希集和remove函数

(def operators '#{ + - * / =})

(defn remove-operators [coll]
  (remove operators (flatten coll)))

(remove-operators '(= a (* b c)))  =>  (a b c)

您需要引用集合operators,以便Clojure不会评估符号 +并将其替换为 function {{1} }。在丢弃不需要的符号之前,我们还使用clojure.core/+将表达式的原始抽象语法树转换为简单的序列。

答案 1 :(得分:2)

我认为您要尝试的是递归地从列表以及该列表中的所有列表中删除特定于 符号(+-/ *)。

(remove #{'+ '- '* '/} '(= a (* b c)))

这使用集#{'+ '- '* '/ '=}作为remove的谓词函数。如果列表中的任何元素在该集合中,则得到remove d。

但是要匹配您的示例输出,我们必须将'=添加到符号集,并且列表也必须变平:

(remove #{'+ '- '* '/ '=} (flatten '(= a (* b c))))
=> (a b c)

如果要保留嵌套列表,则可以使用clojure.walk做类似的事情:

(clojure.walk/postwalk
  (fn [v]
   (if (list? v)
     (remove #{'+ '- '* '/ '=} v)
     v))
  '(= a (* b c)))
=> (a (b c))