关于命令行:将Expression作为参数传递给Clojure REPL

Pass Expression as arguments to Clojure REPL

我一直在学习Clojure,最近我一直在使用REPL作为一个命令行计算器,如果可以将参数传递给Clojure REPL并获得输出,我的"工作流程"将会大大改善,有没有人知道怎么做?

澄清:例如我想执行lein"(+ 2 2)"并让它返回4

1
2
~  lein"(+ 2 2)"
'(+ 2 2)' is not a task. See 'lein help'.

除了启动REPL之外,lein(Leiningen)是错误的工具。如果你真的想要一个Clojure程序的命令行界面,那也是可能的,但是需要你把它编译成jar并执行它,参见这篇关于构建CLI clojure应用程序的文章。


grenchman创建一个repl,每个命令行调用从该repl获得一个结果,这可能是你想要的。


1
2
3
4
5
# as bash variable
{ echo"$clj-expressions"; cat - ; } | lein repl

# as file
{ cat ./script.clj;        cat - ; } | lein repl

幸运的是,lein repl只是一个简单的unix过程

这里的想法是将命令发送到repl的stdin,但确保之后连接当前终端的stdin。

感谢Jonathan Leffler的这一次。他的回答解决了这个问题。

要收集输出,您可以随时吐出一些内容作为您运行的脚本的一部分。


这正是REPL的工作原理 - 你写了一些表达式并按下Enter,得到了表达式结果。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
→  lein repl
nREPL server started on port 59650 on host 127.0.0.1
REPL-y 0.3.0
Clojure 1.5.1
    Docs: (doc function-name-here)
          (find-doc"part-of-name-here")
  Source: (source function-name-here)
 Javadoc: (javadoc java-object-or-class-here)
    Exit: Control+D or (exit) or (quit)
 Results: Stored in vars *1, *2, *3, an exception in *e

user=> (+ 42 42)
84
user=>


你在def的任何东西都可以在REPL上找到。

1
2
3
4
5
6
7
=> (def ten 10)
...
=> (defn fact [n] (apply * (range 1 (inc n))))
...
=> (fact ten)
 3628800
=>