Lisp: Java.lang.Integer'dan ISeq qanday yaratilishini bilmayman

Men matnli faylni ochishga harakat qilaman va uni Clojure-da tamsayı qiymatlari ro'yxatiga bo'lishga harakat qilaman. Men ushbu xato kodini har doim qabul qilaman va nima uchun bu haqida hech qanday tasavvurga ega emasman. Men Lispni rivojlantirish uchun nisbatan yangi (men ikki soat oldin boshlanganman degan ma'noni anglatadi), shuning uchun men haqiqatan ham aqldan savol so'rayapman. Cheers

(ns clojure.examples.hello
  (:gen-class))

(ns clojure-noob.core)

(defn toInt [s]
  (Integer/parseInt (re-find #"\A-?\d+" s)))
(defn toIntList [s]
  (if (not s) ()
    (list* (toInt (first (toInt s)) (toIntList first((rest 
  (clojure.string/split s #" "))))))
  )
)

(println (str (toIntList (slurp "hab.txt"))))
1
hab.txt nimani o'z ichiga oladigan namunaviy kirishni joylashtirasizmi?
qo'shib qo'ydi muallif Taylor Wood, manba
hab.txt nimani o'z ichiga oladigan namunaviy kirishni joylashtirasizmi?
qo'shib qo'ydi muallif Taylor Wood, manba
bo'shliqlar bilan ajratilgan tamsayılar soni
qo'shib qo'ydi muallif Márton Kardos, manba
bo'shliqlar bilan ajratilgan tamsayılar soni
qo'shib qo'ydi muallif Márton Kardos, manba
bo'shliqlar bilan ajratilgan tamsayılar soni
qo'shib qo'ydi muallif Márton Kardos, manba

6 javoblar

Siz xato xabari olganingiz sababli, (bir joyda) noto'g'ri, bir tamsayı argumenti bilan ketma-ketlik argumentlarini kutadigan funktsiyani da'vat qilasiz. Bu mumkin bo'lgan yagona joy:

(first (toInt s))

birinchi funktsiyasi ketma-ketlikni kutadi ( ISeq ), lekin toInt butun sonni qaytaradi.

Va faqat tasdiqlash uchun:

(first (java.lang.Integer/parseInt "10"))

IllegalArgumentException ISeqni qanday yaratishni bilmayman: java.lang.Integer

2
qo'shib qo'ydi

Siz xato xabari olganingiz sababli, (bir joyda) noto'g'ri, bir tamsayı argumenti bilan ketma-ketlik argumentlarini kutadigan funktsiyani da'vat qilasiz. Bu mumkin bo'lgan yagona joy:

(first (toInt s))

birinchi funktsiyasi ketma-ketlikni kutadi ( ISeq ), lekin toInt butun sonni qaytaradi.

Va faqat tasdiqlash uchun:

(first (java.lang.Integer/parseInt "10"))

IllegalArgumentException ISeqni qanday yaratishni bilmayman: java.lang.Integer

2
qo'shib qo'ydi

hab.txt - bu bo'shliqni ajratuvchi tamsayılardan iborat yagona satr bo'lsa, bu quyidagicha bo'lishi kerak:

(defn to-int [s]
  (Integer/parseInt (re-find #"\A-?\d+" s)))
(defn parse-int-str [s]
  (map to-int (clojure.string/split s #" ")))
(println (parse-int-str "1 2 3 4 5"))
=> (1 2 3 4 5)

Yoki so'ralganidek, takrorlovchi versiya:

(defn parse-int-str [s]
  (loop [nums []
         strs (clojure.string/split s #" ")]
    (if (seq strs)
      (recur (conj nums (to-int (first strs)))
             (rest strs))
      nums)))

Buni loop / recur holda bajarishingiz mumkin, ammo siz bo'shashtirilgan bo'shliqqa xavf tug'dirasiz. Buni reduce bilan qilish haqida o'ylashingiz mumkin.

1
qo'shib qo'ydi
@ MártonKardos xaritasi, kamaytirish, filtrlash, qo'llash, FPning Shveytsariya pichoqi
qo'shib qo'ydi muallif sova, manba
Oh, map funksiyasini unutgan edim, rahmat: D Aytishim bilan versiya bo'lsa yaxshi bo'lardi, faqat xatoga yo'l qo'yganimni ko'ray.
qo'shib qo'ydi muallif Márton Kardos, manba

hab.txt - bu bo'shliqni ajratuvchi tamsayılardan iborat yagona satr bo'lsa, bu quyidagicha bo'lishi kerak:

(defn to-int [s]
  (Integer/parseInt (re-find #"\A-?\d+" s)))
(defn parse-int-str [s]
  (map to-int (clojure.string/split s #" ")))
(println (parse-int-str "1 2 3 4 5"))
=> (1 2 3 4 5)

Yoki so'ralganidek, takrorlovchi versiya:

(defn parse-int-str [s]
  (loop [nums []
         strs (clojure.string/split s #" ")]
    (if (seq strs)
      (recur (conj nums (to-int (first strs)))
             (rest strs))
      nums)))

Buni loop / recur holda bajarishingiz mumkin, ammo siz bo'shashtirilgan bo'shliqqa xavf tug'dirasiz. Buni reduce bilan qilish haqida o'ylashingiz mumkin.

1
qo'shib qo'ydi
@ MártonKardos xaritasi, kamaytirish, filtrlash, qo'llash, FPning Shveytsariya pichoqi
qo'shib qo'ydi muallif sova, manba
Oh, map funksiyasini unutgan edim, rahmat: D Aytishim bilan versiya bo'lsa yaxshi bo'lardi, faqat xatoga yo'l qo'yganimni ko'ray.
qo'shib qo'ydi muallif Márton Kardos, manba

Faylni tayyorlaylik:

(spit "foo.txt" "  3 5  662 35 3  ")

Keling, faylni o'qib chiqamiz, satrni bo'sh belgilar bilan ajratamiz, bo'sh narsalarni olib tashlaymiz va ularni butun sonlarga ajratamiz. Kod

(as->
   "foo.txt" $ 
   (slurp $)
   (clojure.string/split $ #"\s+")
   (remove empty? $)
   (mapv #(java.lang.Integer/parseInt %) $))

beradi

[3 5 662 35 3]
0
qo'shib qo'ydi

Faylni tayyorlaylik:

(spit "foo.txt" "  3 5  662 35 3  ")

Keling, faylni o'qib chiqamiz, satrni bo'sh belgilar bilan ajratamiz, bo'sh narsalarni olib tashlaymiz va ularni butun sonlarga ajratamiz. Kod

(as->
   "foo.txt" $ 
   (slurp $)
   (clojure.string/split $ #"\s+")
   (remove empty? $)
   (mapv #(java.lang.Integer/parseInt %) $))

beradi

[3 5 662 35 3]
0
qo'shib qo'ydi