7

手头的问题是,当我使用lein run它运行程序时(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

4

2 回答 2

12

试试lein trampoline run,它有效。

以下来自 leiningen 常见问题解答:

问:我无法访问项目中的标准输入。

A:这是JVM进程处理方式的限制;他们都没有正确地公开标准输入。这意味着 read-line 之类的函数在大多数情况下都不会按预期工作,尽管 repl 任务必须包含一个解决方法。您还可以使用 trampoline 任务在 Leiningen 退出后启动项目的 JVM,而不是将其作为子进程启动。

于 2012-06-04T15:11:21.580 回答
0

我尝试了您的源代码,但省略了刷新。它没有问题。您使用的是哪个版本的 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 运行一起使用。您在原始示例中有 (flush)。

(defn print-prompt []
  (print "prompt> ")
  (flush)
)

据我所知, println 会导致冲洗,而 print 不会,并且您需要在打印后冲洗。

我正在添加此信息以防万一它可能有帮助。我有一个名为 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)
于 2012-06-04T15:29:06.517 回答