当前的问题是,当我使用lein run
运行我的程序时,它会进入(read-line)
部分而我无法摆脱它,这意味着:read-line永远不会返回。
以下是相关代码:
(def command (atom ""))
(defn print-prompt []
(print "prompt> ")
(flush)
)
(defn ask-for-input []
(print-prompt)
(let [x (str (read-line))]
(println (str "User input: " x))
(reset! command x)
)
)
我从未在屏幕上看到“用户输入:”字符串。
奇怪的是,如果我运行lein repl
并调用(ask-for-input)
,那么它可以正常工作:S
答案 0 :(得分:12)
尝试 lein trampoline运行,它有效。
以下是来自leiningen FAQ:
问:我无法访问项目中的stdin。
答:这是JVM流程处理方法的限制;他们都没有正确地暴露stdin。这意味着像read-line这样的函数在大多数情况下都不会按预期工作,尽管repl任务必然包含一个变通方法。您也可以使用trampoline任务在Leiningen退出后启动项目的JVM,而不是将其作为子进程启动。
答案 1 :(得分:0)
我尝试了你的源代码,但省略了flush。它没有问题。您使用的是什么版本的Clojure?我用Clojure 1.3尝试了以下代码。
(def command (atom 0))
(defn print-prompt []
(print "prompt> ")
)
(defn ask-for-input
[]
(print-prompt)
(let [x (str (read-line))]
(println (str "User input: " x))
(reset! command x)
))
编辑: 我修改了我复制和测试过的一个函数,它现在可以独立运行并运行lein。你原来的例子中有(冲洗)。
(defn print-prompt []
(print "prompt> ")
(flush)
)
从我能得到的东西来看,println会导致刷新,打印不会,打印后需要刷新。
我正在添加此信息,以防它可能有所帮助。我有一个名为repl-test的Clojure项目。这是我的repl-test项目的core.clj文件头。您的来源已经发布,此文件中包含一些与您的帖子无关的其他功能。
(ns repl-test.core
(:gen-class)
(:use clojure.contrib.command-line)
(:require [clojure.contrib.string :as cstr])
(:require [clojure.contrib.trace :as ctr])
(:require [clojure.string :as sstr])
(:use clojure-csv.core))
这是project.clj文件:
(defproject repl-test "0.0.1-SNAPSHOT"
:description "TODO: add summary of your project"
:dependencies [[org.clojure/clojure "1.3.0"]
[org.clojure/clojure-contrib "1.2.0"]
[clojure-csv/clojure-csv "1.2.4"]
[org.clojure/tools.cli "0.1.0"]
[clj-http "0.1.3"]]
:aot [repl-test.core]
:main repl-test.core)