Python 习语“if __name__ == '__main__'”在 clojure 中的等价物是什么?

2024-01-11

我正在涉足 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(和/或 common lisp)中是否有等效的习惯用法?我并不是在追求一个成熟的单元测试库(好吧,我是,但不是在这个问题中),我只想在模块中包含一些代码,这些代码只会在某些情况下运行,这样我就可以一种快速运行我一直在研究的代码的方法,但仍然允许像普通模块/命名空间一样导入我的文件。


从命令行一遍又一遍地运行 Clojure 脚本并不符合习惯。 REPL 是一个更好的命令行。 Clojure 是一个 Lisp,通常会启动 Clojure 并让同一个实例永远运行,并与其交互而不是重新启动它。您可以一次更改正在运行的实例中的一个函数,运行它们并根据需要插入它们。摆脱繁琐而缓慢的传统编辑/编译/调试周期是 Lisps 的一大特色。

您可以轻松地编写函数来执行诸如运行单元测试之类的操作,并且只要您想运行它们就从 REPL 调用这些函数,否则忽略它们。 Clojure 中很常见使用clojure.contrib.test-is,将测试函数添加到命名空间中,然后使用clojure.contrib.test-is/run-tests运行它们全部。

不从命令行运行 Clojure 的另一个充分理由是 JVM 的启动时间可能会令人望而却步。

如果您确实想从命令行运行 Clojure 脚本,有多种方法可以实现。看Clojure 邮件列表 http://groups.google.com/group/clojure/browse_thread/thread/ca60d98fb4f7e71e/ddc68367d4fa1bc7进行一些讨论。

一种方法是测试命令行参数是否存在。鉴于这种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=>

See 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

In the classes您现在将拥有一堆目录.class文件。从命令行调用您的代码(运行-main默认功能):

$ java -cp ~/path/to/clojure.jar:./classes foo
Hello, command line.

有很多关于编译 Clojure 代码的信息clojure.org http://clojure.org/compilation.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 习语“if __name__ == '__main__'”在 clojure 中的等价物是什么? 的相关文章

随机推荐

  • 如何在 Ubuntu 上修复 Nokogiri?

    我在我的工作站上运行 Ubuntu 13 04 并使用 ruby 2 0 0 它是通过 RVM 安装的 aptitude 显示 libxml2 Package libxml2 State installed Automatically in
  • java扩展类有两种类型

    在java中我有以下内容 ClassA obj new ClassB where ClassB extends ClassA 是类型的对象ClassA or ClassB或两者 如果我们有 ClassB obj new ClassB 看来很
  • Grails3文件上传maxFileSize限制

    我正在尝试更新 Grails 3 中的文件上传 maxFileSize 限制 并尝试了以下配置src main resources application properties application groovy and applicat
  • Chisel 中的矩阵运算

    Chisel是否支持加法 乘法 转置等矩阵运算 如果没有 实施它们的最佳方法是什么 向量怎么样 Chisel 不支持矩阵运算 它是一种用于编写实现此类操作的硬件生成器的 DSL 有关专用数学硬件生成器的示例 请参阅 Hwacha 硬件矢量单
  • 列出用户在过去几天签入 TFS 的所有文件

    我们有很多项目 每个项目都有几个文件 可以从主解决方案根 项目级别和个人级别签入文件 有没有办法找到特定用户在过去几天签入的所有级别的所有文件 如果安装了 TFS 电动工具 则可以在 Visual Studio 命令提示符下使用命令 tfp
  • 断言接口的类型

    在一般情况下 我无法优雅地将图像的像素作为数组获取 f err os Open imgPath check err defer f Close img err image Decode bufio NewReader f check err
  • 如何使用意图共享来共享 gif 图像到可用的应用程序?

    我想与 Whatsapp 等可用应用程序共享 gif 但无法获取我的可绘制资源中存在的 gif 的有效 Uri Uri path Uri parse android resource my package name R drawable g
  • 在Keras“ImageDataGenerator”中,“validation_split”参数是一种K折交叉验证吗?

    我正在尝试对 Keras 模型进行 K 折交叉验证 使用 ImageDataGenerator 和 flow from directory 用于训练和验证数据 我想知道 ImageDataGenerator 中的参数 validation
  • VSTO问题-无法创建Visual Studio Excel工作簿项目

    当我尝试在 Visual Studio 2008 中创建 Excel 2007 工作簿项目时 收到以下错误消息 无法创建项目 因为 Excel Visual Studio 设计时适配器加载项 无法正常工作 Excel 可能已禁用该加载项或使
  • 存在类型和重复参数

    Scala 中重复参数的类型是否可能具有存在类型范围 动机 In 这个答案 https stackoverflow com a 11517724 334519我使用以下案例类 case class Rect2D A N lt Nat row
  • 选择每月记录表格数据库

    mysql gt SELECT FROM con transactions t id p id date amount 10 1 2016 02 17 19 24 05 1800 12 2 2016 02 18 11 40 13 200 1
  • Java/JSF i18n 长文本(术语、常见问题解答)

    在大多数情况下 我只是在页面的某个地方组合了很多短文本字符串 但在某些情况下 我只有一个包含长静态文本的页面 例如术语或常见问题解答 现在 只需将该段落也放入资源包中 或者构建一个到 terms en xhtml 的切换 依此类推 在 JS
  • sed 无法在 bash 脚本中工作

    我已经搜索了几个小时来寻找这个问题的答案 这似乎简单得令人沮丧 我有一个 bash 脚本 我对其进行了简化 以找到阻止其工作的行 并留下 bin bash sed i e s n g usb lenny rss tmp rss tmp 如果
  • 在 Play Framework 视图模板中包含纯 HTML 页面

    有没有办法在 Play 框架的视图模板中包含纯 html 页面 我有一个场景 其中有一个通用视图模板 并且在模板正文中 我想包含某些静态 html 页面 我知道我可以在某个模板中包含其他模板 但我不确定是否可以包含纯 html 页面 一种选
  • 当网格地图中有多个目标时,如何设计A*的启发式?

    我面临一个问题 我必须使用 A 来搜索地图 并且该地图中有多个目标需要达到 我的目标是扩展地图中的最少节点 关于如何设计这个 A 算法的启发式有什么想法吗 谢谢 假设 多个目标 是指您想要实现的目标any one 只需取所有启发式中的最小值
  • 需要discordjs时出错:“找不到模块'node:events'”[重复]

    这个问题在这里已经有答案了 我正在尝试开发一个机器人来表达不同意见 我安装了npm install discord js save图书馆 但是导入的时候却报错 我该如何修复它 命令 node internal modules cjs loa
  • 将鼠标悬停即可开始播放简单的幻灯片

    我正在寻找仅当用户将鼠标悬停在图像上时播放图像幻灯片的最佳方法 当用户将鼠标移到图像之外时幻灯片再次停止 下面的演示完成了我需要的一切 除了悬停功能 Link to demo http snook ca technical fade fad
  • 函数默认模板参数可以放在非默认模板参数之前吗?

    以下代码在 gcc 4 7 1 上编译 struct X template
  • 如何使用设备相机在 iPhone 应用程序中以编程方式拍照?

    在 iPhone 应用程序中 我们可以采取pictures在某些特定的时间间隔以编程方式通过使用iPhone 设备相机 如果是的话请告诉我如何在 iPhone 应用程序中以编程方式拍照 请帮助和建议 Thanks UIImagePicker
  • Python 习语“if __name__ == '__main__'”在 clojure 中的等价物是什么?

    我正在涉足 clojure 并且在尝试确定与这种常见 python 习惯用法等效的 clojure 和 或 Lisp 时遇到了一些麻烦 习惯用法是 在 python 模块的底部通常有一些测试代码 然后是运行该代码的语句 例如 mymodul