Как удалить символы оператора, такие как + - / *, из списка - PullRequest
0 голосов
/ 03 февраля 2019

Как проверить, содержит ли список операторы?Я пытаюсь отфильтровать операторов из списка.

Например, (func '(= a (* b c))) должен вернуть (a b c)

Я пробовал symbol?, но операторы остаются в списке

Ответы [ 2 ]

0 голосов
/ 03 февраля 2019

Вы можете сделать это с помощью простого хэш-набора и функции remove

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

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

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

Вам необходимо заключить в кавычки набор operators, чтобы Clojure не оценивал символ + и замените его функцией clojure.core/+.Мы также используем flatten, чтобы превратить исходное абстрактное синтаксическое дерево выражения в простую последовательность, прежде чем отбрасывать ненужные нам символы.

0 голосов
/ 03 февраля 2019

Я думаю, что вы пытаетесь удалить определенные символы (+ - / *) из списка и все списки в этом списке, рекурсивно.

(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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...