2011-01-17 4 views
26

У меня в настоящее время проблема, когда мне нужно прочитать текстовый файл из командной строки, содержащий хотя бы одно целое число. Я читаю файл, выполняя регулярное выражение, чтобы игнорировать пробелы.Преобразование последовательности строк в целые числа (Clojure)

(re-seq #"[0-9]+" (slurp (first *command-line-args*))) 

После этого мне нужно написать целую функцию, чтобы преобразовать эту последовательность строк в последовательность целых чисел. По-видимому, я не могу отобразить Integer. в последовательности (если я неправильно использую карту).

Есть ли какой-то элегантный способ справиться с этим, что-то похожее на карту? Или мне нужно сначала рекурсивно выскочить и отбросить его до Integer., чтобы заставить это работать?

В настоящее время я изучаю Clojure, и, изучая биты, я возвращаюсь назад и делаю небольшие викторины программистов, которые я использовал для поиска других языков.

ответ

45

Вы ищете Integer/parseInt.

user=> (map #(Integer/parseInt %) ["1" "2" "3" "4"]) 
(1 2 3 4) 

Вы должны обернуть Integer/parseInt в анонимной функции, потому что методы Java не являются функциями.

read-string также будет работать в этом случае:

user=> (map read-string ["1" "2" "3" "4"]) 
(1 2 3 4) 

read-string читает любой объект из строки, а не только целые числа. Итак, если вы сделали (read-string "1.0"), вы вернетесь к двойному. При чтении из внешних источников обычно лучше ограничивать то, что можно прочитать точно, что вам нужно, что в этом случае является целым. Поэтому я рекомендую использовать свой первый пример.

+0

А, это работает! Спасибо! –

+2

+1 Не знал о read-string, но знал, что должно быть что-то вроде этого – twneale

+1

Это работает очень хорошо, но только когда clojure работает на JVM. ClojureCLR не –