我涉足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()
这对于简单的临时测试很有用。通常,通过编写可以使用此模块from mymodule import MyClass
,在这种情况下_runTests()
,从不调用它,但是在代码段的最后,也可以通过python mymodule.py
直接从命令行键入内容来运行该模块。
Clojure(和/或普通Lisp)中是否有一个等同的成语?我不是想要一个完善的单元测试库(嗯,我是,但不是这个问题),我只想在模块中包含一些代码,这些代码只能在某些情况下运行,所以我可以一种快速的方法来运行我一直在努力的代码,但仍允许像普通模块/名称空间一样导入我的文件。
从命令行一遍又一遍地运行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"))
根据如何启动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=>
见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"))
创建一个目录来存储编译的.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
在classes
目录中,您现在将有一堆.class
文件。要从命令行调用代码(-main
默认情况下运行函数):
$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.
clojure.org上有很多有关编译Clojure代码的信息。
问题内容: 问题答案: 每当Python解释器读取源文件时,它就会做两件事: 它设置了一些特殊变量,例如,然后 它执行文件中找到的所有代码。 让我们看看它是如何工作的,以及它与你有关我们在Python脚本中经常看到的检查问题的关系。 代码样例 让我们使用稍微不同的代码示例来探索导入和脚本的工作方式。假设以下文件位于。 特殊变量 当Python交互程序读取源文件时,它首先定义了一些特殊变量。在这种情
问题内容: 我想检查是否包含我的模块或直接运行我的模块。如何在node.js中执行此操作? 问题答案: 文档描述了另一种方法,这可能是首选方法: 直接从Node运行文件时,将require.main设置为其模块。 要利用此优势,请检查该模块是否为主要模块,如果是,请调用您的主要代码: 编辑:如果您在浏览器中使用此代码,由于未定义“要求”,您将得到“参考错误”。为防止这种情况,请使用:
问题内容: 我有一个带有一些静态成员的类,并且我想运行一些代码来初始化它们(假设此代码无法转换成简单的表达式)。在Java中,我只会 除非我弄错了,否则C ++不允许使用此类静态代码块,对吗?我应该怎么做呢? 我想要以下两个选项的解决方案: 初始化在进程加载时发生(或在加载带有此类的DLL时)。 初始化发生在第一次实例化该类时。 对于第二种选择,我在想: 但这是不可能的,因为C ++(目前?)不允
本文向大家介绍Python中if __name__ == '__main__'作用解析,包括了Python中if __name__ == '__main__'作用解析的使用技巧和注意事项,需要的朋友参考一下 当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性
问题内容: 我正在开发一个相对较大的Python应用程序,因此我希望保留几种资源,因为可以在多个不同模块中访问全局变量。这些值包括版本号,版本日期,全局配置以及一些指向资源的静态路径。我还包括了一个由命令行选项设置的标志,以便我可以在调试模式下运行应用程序而无需整个环境。 我一直在谨慎地确保要导入的值在程序运行过程中不会发生变化,并且我已将它们记录为不应被触及的全局常量变量。我的代码本质上看起来像
本文向大家介绍Python中if __name__ == "__main__"详细解释,包括了Python中if __name__ == "__main__"详细解释的使用技巧和注意事项,需要的朋友参考一下 想必很多初次接触python都会见到这样一个语句,if __name__ == "__main__": 那么这个语句到底是做什么用的呢?在解释之前,首先要声明的是,不管你是多么小白,你一定要知