Как я могу лениво оценить read-line для сбора информации? - PullRequest
1 голос
/ 25 марта 2012

(Первоначально это было домашнее задание, но я пробую его на новом языке.)

В короткой программе Clojure я пытаюсь сгенерировать ленивую последовательность входных данных (из командной строки) и вычислить из них три символьных значения. Я бы предположил, что, возможно, в зависимости от того, как Clojure решил оценить мои let привязки, это должно привести к быстрому ряду, подобному следующему:

$ clj lazy-prompts.clj
Enter value #1: 32
Enter value #3: 162
Enter value #2: 12
Enter value #4: 118
a A 5

Вместо этого программа запускается и зависает бесконечно, без подсказок. Я с нетерпением пытался оценить выражение for, обернув его в dorun, но это не изменило результат.

Почему следующая программа не выдает никаких запросов на ввод?

(use '[clojure.java.io :only (reader)])

(def of-input
    (for [value-number [1 2 3 4]]
        (dorun
            (print (str "Enter encrypted value #" value-number))
            (read-line)
        )))

(let [value-1 (nth of-input 1)
      value-2 (nth of-input 2)
      value-3 (nth of-input 3)
      value-4 (nth of-input 4)]

    (let [a (/ (+ value-1 value-3) 2)
          b (/ (+ value-2 value-4) 2)
          c (- value-4 b)]

        (println (char a) (char b) (char c))))

Ответы [ 2 ]

1 голос
/ 25 марта 2012

print не сбрасывает вывод, поэтому вы не видите подсказки сразу.Либо используйте println, либо звоните flush явно, например так:

(def of-input
(for [value-number [1 2 3 4]]
    (dorun
        (print (str "Enter encrypted value #" value-number))
        (flush)
        (read-line)
    )))
1 голос
/ 25 марта 2012

Во-первых, вы должны заменить dorun на do.Первый ожидает seq в качестве первого или второго аргумента и вызывает его.

После этого изменения код более или менее выполняется правильно.То, что вы наблюдаете как «зависание», на самом деле ждет вашего ввода.Одна из проблем заключается в том, что вы не видите подсказки (пока).Они на самом деле показывают, но только после ввода четырех значений.Как вы это исправите?Я не знаю, я всегда думал, что иметь побочные эффекты в ленивой последовательности - плохая идея, поэтому я никогда этого не делаю.

Другая проблема в том, что read-line возвращает строки, а вы используетеих как числа.Сначала вам придется преобразовать их.

PS "for" в clojure - это не цикл for, это понимание списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...