Как считать строки из stdin (*in*) в clojure

Я пишу свою первую clojure программу и хочу считать строки из stdin.

Когда я пробую это:

(doall (map #(println %) (line-seq *in*)))

Я получаю это исключение:

Exception in thread "main" java.lang.ClassCastException: clojure.lang.LineNumberingPushbackReader cannot be cast to java.io.BufferedReader (test.clj:0)

Я получаю те же результаты в версии 1.0 и 1.1

Таким образом, как я преобразовываю *in* в seq я могу выполнить итерации? Я думал бы, что это достаточно распространено это *in* самостоятельно было бы повторяемо, но это не работает ни один - если я пытаюсь использовать его непосредственно, я добираюсь:

java.lang.IllegalArgumentException: Don't know how to create ISeq from: clojure.lang.LineNumberingPushbackReader (NO_SOURCE_FILE:0)

Кроме того, есть ли какие-либо примеры выполнения общей обработки файла в clojure?

38
задан Dave Kirby 9 January 2010 в 16:47
поделиться

1 ответ

Значение переменной alphaChar присваивается на основе некоторого условия. Представьте себе сценарий, в котором переменная x содержит значение, отличное от 0 к 9. Предположим, что он содержит 10. Тогда ни одно из условий случая не будет удовлетворено x , поэтому alphaChar не будет присвоено никакого значения, в результате оно будет полностью неинициализировано. Поэтому при преобразовании alphaChar в строку оно преобразует некоторое значение мусора в строку и возвращает его вызывающему методу. Это причина, по которой вы получаете это сообщение.

Если вы хотите получить простое решение, то добавьте следующий код ниже

case 9: alphaChar = 'J'; 
        break; 

-

default: return null;

и проверьте вызывающие методы, возвращает ли эта функция alphaCoords null или нет, как это -

if(alphaCooord(10) == null)
{
    // x contains value other than 0 to 9
}
else
{
    // x contains value between 0 to 9, so the returned value will be the string
    // representation of the corresponding character
}

Таким образом, ваш код не будет слишком сложным, или вам не нужно будет выбрасывать или обрабатывать любые исключения или что-то подобное.

Надежда, что поможет:).

-121--3432995-

Вы считаете, что вы перезаписываете свои функции фальшивыми? В этом случае перед определением функции можно проверить, определена ли она уже.

if (тип yureFuncterName = = 'функция')

-121--4998575-

Попробуйте обернуть * в * в java.io.BufferedReader . А также используйте doseq вместо doall , как указал devstopfix:

(doseq [ln (line-seq (java.io.BufferedReader. *in*))]
   (println ln))

Обратите внимание, что line-seq задокументирован для требования BufferedReader в качестве источника.

29
ответ дан 27 November 2019 в 03:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: