2011-01-17 10 views
26

Aktualnie mam problem, w którym muszę odczytać plik tekstowy z wiersza poleceń zawierającego co najmniej jedną liczbę całkowitą. Czytam plik, wykonując dopasowanie do wyrażenia regularnego, aby zignorować białe spacje.Konwertuj sekwencję ciągów znaków na liczby całkowite (Clojure)

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

Po tym muszę napisać całą funkcję tylko po to, aby przekształcić ciąg ciągów w ciąg liczb całkowitych. Najwyraźniej nie mogę mapować Integer. do sekwencji (chyba że używam mapy nieprawidłowo).

Czy jest jakiś elegancki sposób radzenia sobie z tym, coś podobnego do mapy? Czy muszę najpierw rekurencyjnie odskoczyć i rzucić go na Integer., aby to zadziałało?

Obecnie uczę się Clojure, a ponieważ uczę się trochę, wracam i robię małe quizy programistyczne, które zbierałem w innych językach.

Odpowiedz

45

Szukasz Integer/parseInt.

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

Musisz zawinąć Integer/parseInt w anonimowej funkcji, ponieważ metody Java nie są funkcjami.

read-string będzie również działać w tym przypadku:

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

read-string czyta dowolny obiekt z ciągiem, a nie tylko liczby całkowite. Tak więc, jeśli zrobiłbyś (read-string "1.0"), otrzymasz podwójne. Czytając ze źródeł zewnętrznych, zazwyczaj lepiej jest ograniczyć to, co można odczytać do dokładnie tego, czego potrzebujesz, co jest w tym przypadku liczbą całkowitą. Dlatego zalecam użycie mojego pierwszego przykładu.

+0

Ah, to działa! Dziękuję Ci! –

+2

+1 Nie miałem pojęcia o łańcuchu znaków, ale wiedziałem, że musi być coś takiego. – twneale

+1

Działa to bardzo dobrze, ale tylko wtedy, gdy clojure działa na JVM. ClojureCLR nie jest –

Powiązane problemy