Clojure 为什么在使用leinrun点击ENTER(看起来像挂起)后,read行不返回,而是与leinrepl一起工作?

Clojure 为什么在使用leinrun点击ENTER(看起来像挂起)后,read行不返回,而是与leinrepl一起工作?,clojure,leiningen,Clojure,Leiningen,目前的问题是,当我用lein run运行我的程序时,它到达(读取行)部分,我无法离开它,这意味着:读取行永远不会返回 以下是相关代码: (def command (atom "")) (defn print-prompt [] (print "prompt> ") (flush) ) (defn ask-for-input [] (print-prompt) (let [x (str (read-line))] (println (str "User

目前的问题是,当我用
lein run
运行我的程序时,它到达
(读取行)
部分,我无法离开它,这意味着:读取行永远不会返回

以下是相关代码:

(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
并调用
(请求输入)
,它就会正常工作:S

Trylein trompoline run,它会正常工作

以下是leiningen常见问题解答:

问:在我的项目中,我没有访问stdin的权限

答:这是JVM进程处理方法的一个限制;它们都没有正确地暴露标准数据。这意味着像readline这样的函数在大多数上下文中都不会像预期的那样工作,尽管repl任务必须包含一个变通方法。您还可以在Leiningen退出后使用trampoline任务启动项目的JVM,而不是将其作为子进程启动


我尝试了你的源代码,但忽略了刷新。它毫无问题地工作了。您使用的是什么版本的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)
    ))
编辑: 我修改了您的一个复制和测试的函数,现在它可以与standalone和lein run一起使用。您在原始示例中使用了(flush)

(defn print-prompt []
  (print "prompt> ")
  (flush)
)
据我所知,println会导致刷新,print不会,而且你需要在打印后刷新

我正在添加此信息,以防可能有所帮助。我有一个名为repl test的Clojure项目。这是我的repl测试项目的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)

什么是命令?你会考虑编辑原来的帖子并把它放进去吗?我正在尝试构建您的代码并查看它。我想我知道它是什么,但如果能看到它就好了。谢谢。@octopusgrabbus在那里,我添加了丢失的行。在lein repl,你怎么称呼这个?我刚输入(要求输入)。不可否认,我把我的区域设置成一个项目。我将在我的回答中发布项目和src标题作为编辑。我使用1.3并切换到1.4以查看是否有帮助,但没有。添加我的项目和core.clj标题。同样的交易,记住在Repl上它是有效的,如果我使用
lein Repl
,然后调用
(-main)
,程序会正常工作,但是如果我使用
lein run
运行它,读取行将永远不会返回。顺便说一句,我的核心是正确的工作与蹦床选项。。你知道为什么吗?如果你看我的帖子,你会发现
(flush)
在那里,你在例子中删除了它,但它一直在那里。明白了。我把flush放回原处,它对我作为uberjar或lein跑步很有效。是的!现在你能解释一下原因吗?:)我猜lein trampoline运行正常,因为数据正在被刷新。