当前位置: 首页 > 面试题库 >

Python习惯用法“如果__name__ =='__main__'”的clojure等效项是什么?

鲜于渊
2023-03-14
问题内容

我涉足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应用程序,因此我希望保留几种资源,因为可以在多个不同模块中访问全局变量。这些值包括版本号,版本日期,全局配置以及一些指向资源的静态路径。我还包括了一个由命令行选项设置的标志,以便我可以在调试模式下运行应用程序而无需整个环境。 我一直在谨慎地确保要导入的值在程序运行过程中不会发生变化,并且我已将它们记录为不应被触及的全局常量变量。我的代码本质上看起来像

  • 问题内容: 在C / C ++(以及该家族的许多语言)中,根据条件声明和初始化变量的常用习语使用三元条件运算符: Go没有条件运算符。实现与上述相同代码的最惯用方式是什么?我来到以下解决方案,但似乎很冗长 有更好的东西吗? 问题答案: 正如指出的那样(并希望毫不奇怪),使用确实是Go 语言中进行条件处理的惯用方式。 但是,除了完整的代码块之外,还经常使用以下拼写: 并且如果您有足够重复的代码块(例