Единственный предикат для проверки "самооценки" атомов в Clojure - PullRequest
4 голосов
/ 29 июня 2011

На домашнем сайте Clojure есть следующее утверждение:

Строки, цифры, символы, правда, false, nil и ключевые слова оцениваются как сами по себе.

Существует ли один комбинированный предикат, который проверяет любой из них, объединяя string?, number?, char?, true?, false?, nil? и keyword?. Должен ли я просто использовать (complement symbol?)?

Ответы [ 3 ]

3 голосов
/ 29 июня 2011

Возможно, я что-то упустил, но вы можете использовать следующее для проверки любого из этих условий и вернуть true, если одно из них истинно:

(defn self-eval?
  [x]
  (or (string? x)
      (number? x)
      (char? x)
      (keyword? x)
      (true? x)
      (false? x)
      (nil? x)))
2 голосов
/ 29 июня 2011

Достаточно легко написать макрос, который спрашивает "оценивает ли данное выражение себя". Фактически это хороший пример задач, которые могут быть выполнены только с помощью макроса, потому что они должны видеть аргумент как оцененный, так и неоцененный.

(defmacro selfp [a] `(= ~a (quote ~a)))
#'user/selfp
user> (selfp 1)
true
user> (selfp +)
false
user> (selfp [1 2])
true
user> (selfp '(+ 1 2 3))
false

Несмотря на то, что строки, числа, символы, ключевые слова и логические значения являются самооценочными, другие вещи, такие как [1 2], также могут быть полезными, так что в общем случае это может оказаться бесполезным.

0 голосов
/ 29 июня 2011

Другой вариант - создать функцию, которая использует карту:

(defn myclassifier? [x]
   (let [types-I-care-about #{java.lang.Sring ...}]
      (if (types-I-care-about (type x))
          true
          false)))

Другой вариант, который может иметь более высокую производительность, - использовать динамизм Java:

(extend-type Object
  IMyClassifier
  (myclassifier? [x]
            (let [c (.getClass x)]
             (if (types-I-care-about (type c))
               (do
                 (extend-type (.getClass x)
                   IMyClassifier
                   (myclassifier? [x] true))
                 true)
               false))))

где types-I-care-about - набор типов, которые вам нужны.

...