Регистр для первого символа строки - PullRequest
3 голосов
/ 24 сентября 2010

Мне нужно принять решение о строке на основе первого символа, и у меня есть метод, определенный следующим образом:

(defn check-first [string]
  (case (get string 0)
    "+" 1
    "-" 2
    3
    ))

В настоящее время он всегда возвращает 3, даже если строка начинается с этих символов. Что я делаю неправильно? Кроме того, есть ли более элегантный способ реализовать это?

Ответы [ 3 ]

10 голосов
/ 24 сентября 2010
(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 кажется слишком общим названием для этой функции;У меня нет лучших предложений, но я бы подумал об их изменении.(при условии, что это не было сделано для цели этого вопроса.)

3 голосов
/ 25 сентября 2010

Вы можете сохранить то, что у вас есть, и использовать метод подстроки Java в вашем случае:

(defn check-first [s]
  (case (.substring s 0 1)
    "+" 1
    "-" 2
    3))

Редактировать: Только что заметил, что MayDaniel уже упомянул subs, который работает так же, как .substring. Извините, здесь рано ...

0 голосов
/ 24 сентября 2010

Вы хотели использовать cond?

http://clojure -notes.rubylearning.org /

(def x 10)
(cond
(< x 0) (println "Negative!")
(= x 0) (println "Zero!"))
; => nil

(cond
(< x 0) (println "Negative!")
(= x 0) (println "Zero!")
:default (println "Positive!"))
; => Positive!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...