Tim*_*ert 25 lisp python idioms clojure
我正在涉足clojure,并且在尝试确定与这种常见python成语相当的clojure(和/或Lisp)方面遇到了一些麻烦.
习惯用法是在python模块的底部经常有一些测试代码,然后是运行代码的语句,例如:
# mymodule.py
class MyClass(object):
"""Main logic / code for the library lives here"""
pass
def _runTests():
# Code which tests various aspects of MyClass...
mc = MyClass() # etc...
assert 2 + 2 == 4
if __name__ == '__main__': _runTests()
Run Code Online (Sandbox Code Playgroud)
这对于简单的临时测试很有用.通常会通过写入来使用此模块from mymodule import MyClass
,在这种情况下_runTests()
永远不会调用,但是在末尾使用代码片段,也可以通过python mymodule.py
直接从命令行键入来运行它.
在Clojure(和/或常见的lisp)中是否有相同的习惯用法?我不是在一个完整的单元测试库之后(好吧,我,但不是在这个问题中),我只想在一个模块中包含一些代码,这些代码只能在某些情况下运行,所以我可以拥有一种快速运行代码的方法我一直在努力,但仍允许我的文件像普通模块/命名空间一样导入.
Bri*_*per 27
从命令行反复运行Clojure脚本并不是惯用的.REPL是一个更好的命令行.Clojure是一个Lisp,通常会激活Clojure并使相同的实例永远运行,并与之交互而不是重新启动它.您可以一次更改正在运行的实例中的函数,运行它们并根据需要进行戳.逃避繁琐而缓慢的传统编辑/编译/调试周期是Lisps的一大特色.
您可以轻松编写函数来执行运行单元测试等操作,只需在运行它们时从REPL调用这些函数,否则忽略它们.在Clojure中使用clojure.contrib.test-is
,将测试函数添加到命名空间,然后使用clojure.contrib.test-is/run-tests
它们运行它们是很常见的.
不从命令行运行Clojure的另一个好理由是JVM的启动时间可能过高.
如果您真的想从命令行运行Clojure脚本,可以通过多种方式执行此操作.有关讨论,请参阅Clojure邮件列表.
一种方法是测试命令行参数的存在.鉴于这种foo.clj
在当前目录:
(ns foo)
(defn hello [x] (println "Hello," x))
(if *command-line-args*
(hello "command line")
(hello "REPL"))
Run Code Online (Sandbox Code Playgroud)
根据你如何开始Clojure,你会得到不同的行为.
$ java -cp ~/path/to/clojure.jar:. clojure.main foo.clj --
Hello, command line
$ java -cp ~/path/to/clojure.jar:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (use 'foo)
Hello, REPL
nil
user=>
Run Code Online (Sandbox Code Playgroud)
见src/clj/clojure/main.clj
在Clojure的来源,如果你想看到这是如何工作的.
另一种方法是将代码编译为.class
文件并从Java命令行调用它们.给定源文件foo.clj
:
(ns foo
(:gen-class))
(defn hello [x] (println "Hello," x))
(defn -main [] (hello "command line"))
Run Code Online (Sandbox Code Playgroud)
创建一个目录来存储编译的.class
文件; 这默认为./classes
.你必须自己创建这个文件夹,Clojure不会创建它.还要确保设置$CLASSPATH
包含./classes
和包含源代码的目录; 我假设foo.clj
是在当前目录中.所以从命令行:
$ mkdir classes
$ java -cp ~/path/to/clojure.jar:./classes:. clojure.main
Clojure 1.1.0-alpha-SNAPSHOT
user=> (compile 'foo)
foo
Run Code Online (Sandbox Code Playgroud)
在classes
目录中,您将拥有一堆.class
文件.要从命令行调用代码(-main
默认情况下运行该函数):
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
Run Code Online (Sandbox Code Playgroud)
关于在clojure.org上编译Clojure代码有很多信息.
归档时间: |
|
查看次数: |
3524 次 |
最近记录: |