Lisp: Não sei como criar o ISeq em Java.lang.Integer

Estou tentando abrir um arquivo de texto e dividi-lo em uma lista de valores inteiros no Clojure. Eu recebo este código de erro toda vez, e não tenho idéia do porquê. Eu sou relativamente novo no desenvolvimento de Lisp (quero dizer, eu comecei como duas horas atrás), então pode ser que eu esteja fazendo uma pergunta realmente boba. Felicidades

(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
Você poderia postar uma entrada de exemplo como o que o hab.txt conteria?
adicionado o autor Taylor Wood, fonte
Você poderia postar uma entrada de exemplo como o que o hab.txt conteria?
adicionado o autor Taylor Wood, fonte
apenas um monte de inteiros separados por espaços
adicionado o autor Márton Kardos, fonte
apenas um monte de inteiros separados por espaços
adicionado o autor Márton Kardos, fonte
apenas um monte de inteiros separados por espaços
adicionado o autor Márton Kardos, fonte

6 Respostas

A razão pela qual você está recebendo essa mensagem de erro é que (em algum lugar) você está chamando incorretamente uma função que espera um argumento de seqüência com um argumento inteiro. Um lugar que isso poderia ser está aqui:

(first (toInt s))

A função primeiro espera uma seqüência ( ISeq ), mas toInt está retornando um inteiro.

E apenas para confirmar:

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

IllegalArgumentException Não sabe como criar o ISeq em: java.lang.Integer

2
adicionado

A razão pela qual você está recebendo essa mensagem de erro é que (em algum lugar) você está chamando incorretamente uma função que espera um argumento de seqüência com um argumento inteiro. Um lugar que isso poderia ser está aqui:

(first (toInt s))

A função primeiro espera uma seqüência ( ISeq ), mas toInt está retornando um inteiro.

E apenas para confirmar:

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

IllegalArgumentException Não sabe como criar o ISeq em: java.lang.Integer

2
adicionado

Assumir que hab.txt é apenas uma única linha de números inteiros delimitados por espaço, isso deve funcionar:

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

Ou uma versão recursiva, conforme solicitado:

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

Você pode fazer isso sem o loop / recur , mas arrisca esgotar o espaço da pilha. Você também pode pensar em fazer isso com reduce .

1
adicionado
@ MártonKardos mapa, reduzir, filtrar, aplicar são o canivete suíço de FP
adicionado o autor sova, fonte
Ah, eu realmente me esqueci da função do mapa, obrigado: D A propósito, seria ótimo se eu tivesse uma versão usando recursão, só para me deixar ver onde cometi o erro
adicionado o autor Márton Kardos, fonte

Assumir que hab.txt é apenas uma única linha de números inteiros delimitados por espaço, isso deve funcionar:

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

Ou uma versão recursiva, conforme solicitado:

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

Você pode fazer isso sem o loop / recur , mas arrisca esgotar o espaço da pilha. Você também pode pensar em fazer isso com reduce .

1
adicionado
@ MártonKardos mapa, reduzir, filtrar, aplicar são o canivete suíço de FP
adicionado o autor sova, fonte
Ah, eu realmente me esqueci da função do mapa, obrigado: D A propósito, seria ótimo se eu tivesse uma versão usando recursão, só para me deixar ver onde cometi o erro
adicionado o autor Márton Kardos, fonte

Vamos preparar um arquivo:

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

Agora vamos ler o arquivo, dividir a string por símbolos vazios, remover os vazios e analisá-los em inteiros. O código

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

[3 5 662 35 3]
0
adicionado

Vamos preparar um arquivo:

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

Agora vamos ler o arquivo, dividir a string por símbolos vazios, remover os vazios e analisá-los em inteiros. O código

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

[3 5 662 35 3]
0
adicionado