将表达式作为参数传递给Clojure REPL

3

我一直在学习Clojure语言,最近将REPL作为命令行计算器使用。如果能够向Clojure REPL传递参数并获得输出,我的“工作流”将大大改善,请问有人知道如何做到这一点吗?

澄清一下:例如,我想执行lein "(+ 2 2)"并返回4。

~  lein "(+ 2 2)"
'(+ 2 2)' is not a task. See 'lein help'.
5个回答

2

lein(Leiningen)仅适用于启动REPL,不适合此任务。如果您确实需要一种命令行界面来运行Clojure程序,则也可以实现,但需要将其编译为JAR文件并执行它,参见此篇构建CLI Clojure应用的文章


2

Grenchman 创建了一个REPL,每个命令行调用都会从该REPL获取结果,这很可能是您想要的。


谢谢,这正是我在寻找的。 - xanth

0
# 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提供的帮助。他在这里的答案解决了这个问题。

要收集输出,您可以始终spit一些作为您运行的脚本的一部分。


-1

在 REPL 中,您定义的任何 def 都是可用的。

=> (def ten 10)
...
=> (defn fact [n] (apply * (range 1 (inc n))))
...
=> (fact ten)
 3628800
=>

-1

这就是 REPL 的工作原理 - 您编写一些表达式并按下 Enter,然后得到表达式的结果。

→  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=> 

我在我的帖子中添加了一些澄清。我想要做的是将“(+ 21 21)”传递给lein,并使其返回42。 - xanth
请看以下网页:http://charsequence.blogspot.com/2012/04/scripting-clojure-with-leiningen-2.html - edbond

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接