Lisp: Не знаю, як створити ISeq з Java.lang.Integer

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

(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 ?
додано Автор Taylor Wood, джерело
Не могли б ви опублікувати зразок введення, наприклад, що міститься hab.txt ?
додано Автор Taylor Wood, джерело
просто купу цілих чисел, розділених пропусками
додано Автор Márton Kardos, джерело
просто купу цілих чисел, розділених пропусками
додано Автор Márton Kardos, джерело
просто купу цілих чисел, розділених пропусками
додано Автор Márton Kardos, джерело

6 Відповіді

Причина, по якій ви отримуєте повідомлення про помилку, полягає в тому, що (десь) ви неправильно викликаєте функцію, яка очікує аргумент послідовності з цілим аргументом. Одне місце, яке це може бути, є тут:

(first (toInt s))

Функція first очікує послідовність ( ISeq ), але toInt повертає ціле число.

І лише для підтвердження:

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

IllegalArgumentException Не знаю, як створити ISeq з: java.lang.Integer

2
додано

Причина, по якій ви отримуєте повідомлення про помилку, полягає в тому, що (десь) ви неправильно викликаєте функцію, яка очікує аргумент послідовності з цілим аргументом. Одне місце, яке це може бути, є тут:

(first (toInt s))

Функція first очікує послідовність ( ISeq ), але toInt повертає ціле число.

І лише для підтвердження:

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

IllegalArgumentException Не знаю, як створити ISeq з: java.lang.Integer

2
додано

Припускаючи, що hab.txt - це лише один рядок цілих чисел, розділених простором, це має працювати:

(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)

Або рекурсивна версія за запитом:

(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)))

Ви можете зробити це без циклу / recur , але ви ризикуєте вичерпати простір стека. Ви також можете подумати про це за допомогою reduction .

1
додано
@ Карта MártonKardos, зменшити, фільтрувати, застосовувати є швейцарський армійський ніж FP
додано Автор sova, джерело
О, я дійсно забув про функцію карти, спасибі: D До речі, було б здорово, якби у мене була версія, що використовує рекурсію, просто щоб дати мені побачити, де я зробив помилку
додано Автор Márton Kardos, джерело

Припускаючи, що hab.txt - це лише один рядок цілих чисел, розділених простором, це має працювати:

(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)

Або рекурсивна версія за запитом:

(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)))

Ви можете зробити це без циклу / recur , але ви ризикуєте вичерпати простір стека. Ви також можете подумати про це за допомогою reduction .

1
додано
@ Карта MártonKardos, зменшити, фільтрувати, застосовувати є швейцарський армійський ніж FP
додано Автор sova, джерело
О, я дійсно забув про функцію карти, спасибі: D До речі, було б здорово, якби у мене була версія, що використовує рекурсію, просто щоб дати мені побачити, де я зробив помилку
додано Автор Márton Kardos, джерело

Давайте підготуємо файл:

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

Тепер давайте прочитаємо файл, розділимо рядок на порожні символи, видалімо порожні і розберемо їх у цілі числа. Код

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

дає

[3 5 662 35 3]
0
додано

Давайте підготуємо файл:

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

Тепер давайте прочитаємо файл, розділимо рядок на порожні символи, видалімо порожні і розберемо їх у цілі числа. Код

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

дає

[3 5 662 35 3]
0
додано
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників