Прежде всего, Am C # Starter, поэтому, если есть возможность редактировать код, я разместил его, пожалуйста, продолжайте и оптимизируйте его.
Это отлично походит, как работают карты (самые естественные объекты в Clojure). Когда карту называют как функция, она работает отображением:
user=> (def ob {:foo "bar", :bar :baz, :qwerty 42})
#'user/ob
user=> (ob :foo)
"bar"
Таким образом, это имеет смысл, которым набор Clojure можно назвать как функция и будет работать тестом членства. Между прочим, если Вы используете ключевые слова (те вещи, которые запускаются с двоеточия) как ключи отображения, они также работают подобными функциями, таким образом, можно сделать
user=> (:bar ob)
:baz
и даже то же самое с наборами ключевых слов:
user=> (def vowel-keywords (set [:a :e :i :o :u]))
#'user/vowel-keywords
user=> (:a vowel-keywords)
:a
user=> (:b vowel-keywords)
nil
Но, снова, этот последний прием только еще работает с ключевыми словами, ничто, что Вы могли бы использовать в качестве ключей в отображении или участниках в наборе.
Ага! Я закончил тем, что нашел его сам. Это на самом деле не возвращается true
или false
, скорее это возвращает первое вхождение в наборе или ноль, если это не происходит.
И потому что можно использовать это в качестве условия (ноль, обрабатываемый как ложь и неноль, столь же верный), это работает как миленький взлом на проверку, если строка содержит букву.
(vowel? (first "abc")) ; => "a"
(vowel? (first "cba")) ; => nil
(if (vowel? (first "abc"))
(println "yay")
(println "oops")) ; => "yay"