(get "foo" 0)
;; => \f
(get "foo" 0)
возвращает char
, а не string
, поэтому, если вы хотите использовать check-first
, вам необходимо заменить строки на символы.
(defn check-first [s]
(case (first s) \+ 1, \- 2, 3))
Кстати, Стандарты кодирования библиотеки Clojure рекомендуют использовать s
в качестве имени аргумента для функций, требующих ввода строки.
Если вы предпочитаете использовать строки вместо символов:(str (first "foo"))
или (subs "foo" 0 1)
=> "f"
В качестве альтернативы можно написать макрос case-indexed
.
Следующее является быстрым взломом и не предоставляет опцию для выражения по умолчанию:
(defmacro case-indexed [expr & clauses]
(list* 'case expr (interleave clauses (iterate inc 1))))
;; (case-indexed "foo" "bar" "baz" "foo") => 3
;; (case-indexed (+ 5 1) 3 4 5 6 7) => 4
(defn check-first [s]
(case-indexed (first s)
\+, \-, \*, \/))
Я не думаю, что я бы разделил предложения, как это - просто чтобы сделать ответ более кратким.
Я бы рекомендовал расширить case-indexed
для выражений по умолчанию, еслиодин должен был использовать это, хотя.Кроме того, check-first
кажется слишком общим названием для этой функции;У меня нет лучших предложений, но я бы подумал об их изменении.(при условии, что это не было сделано для цели этого вопроса.)