为什么在使用lein run命中ENTER(看起来像挂起)后读取行不返回,但是与lein repl一起工作?

时间:2012-06-04 14:41:04

标签: clojure leiningen

当前的问题是,当我使用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

2 个答案:

答案 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)