Clojure (read-line) не ждет ввода - PullRequest
       42

Clojure (read-line) не ждет ввода

5 голосов
/ 10 октября 2011

Я пишу текстовую игру в Clojure. Я хочу, чтобы игрок печатал строки на консоли, а игра отвечала построчно.

Исследования показали, что (read-line) - это способ получения строк текста из стандартного ввода в Clojure, но он не работает для меня.

Я нахожусь в новом проекте Leiningen, и я добавил предложение :main в project.clj, указывающее на единственный исходный файл:

(ns textgame.core)

(defn -main [& args]
  (println "Entering -main")
;  (flush)                      ;makes no difference if flush are commented out
  (let [input (read-line)]
    (println "ECHO:" input))
;  (flush)
  (println "Exiting -main"))

с использованием lein run выход:

Entering -main
ECHO: nil
Exiting -main

Другими словами, нет возможности вводить текст на консоли для (read-line) для чтения.

Как заставить Clojure ждать ввода символов и новой строки и возвращать соответствующую строку?

(Я использую GNOME Terminal 2.32.1 в Linux Mint 11, Leiningen 1.6.1.1 в Java 1.6.0_26 64-разрядная серверная виртуальная машина Java HotSpot (TM), Clojure версия 1.2.1.)

Обновление: если я запускаю lein repl, я могу (println (read-line)), но не тогда, когда у меня есть функция -main и я запускаю с использованием lein run.

Ответы [ 4 ]

6 голосов
/ 02 марта 2012

Попробуйте "Бег на батуте".Подробнее см. http://groups.google.com/group/leiningen/browse_thread/thread/a07a7f10edb77c9b от https://github.com/technomancy/leiningen:

В: У меня нет доступа к stdin внутри моего проекта.

A: Проблема вбиблиотека, которую Leiningen использует для создания новых процессов, блокирующих доступ к консольному вводу.Это означает, что такие функции, как read-line, не будут работать должным образом в большинстве контекстов, хотя задача repl обязательно включает обходной путь.Вы также можете использовать задачу батута, чтобы запустить JVM вашего проекта после выхода из Leiningen, а не запускать его как подпроцесс.

1 голос
/ 27 мая 2012

Оберните ваши вызовы read-line с помощью макроса с поддержкой-read-line-support, который теперь находится в ns swank.core [начиная с swank-clojure 1.4+, я считаю]:

(use 'swank.core)
(with-read-line-support 
  (println "a line from Emacs:" (read-line)))

Спасибо Тавису Джадду за исправление.

1 голос
/ 10 октября 2011

У меня были похожие проблемы, и я решил создать файл jar и запустить его.

lein uberjar
java -jar project-standalone.jar

Это немного медленнее, хотя я и остался на местеОтвет, который работает из repl, был бы лучше

0 голосов
/ 11 октября 2011

Не уверен насчет сторонних аспектов проблемы, но определенно в emacs невозможно заставить работать stdin.Однако, если вы хотите получить текст от пользователя, вы можете легко сделать это, используя JOptionPane, как этот код из моей маленькой программы крестики-нолики:

...