首页 文章

没有Java经验的Clojure开始 - 如何最好地组织和运行项目?

提问于
浏览
10

对这一系列相关问题的某种话语性质提前道歉;我希望答案对于Clojure的新人来说是一个有用的资源 .

我刚刚开始学习Clojure,部分原因是this文章 . 我'm not a professional developer but I have several decades of programming experience (ARexx, VB/VBScript/VBA, then Perl and daily use of R starting in 2011). My platform is Windows 7 64-bit. I'm在Java 1.7.0_45 Java Hotspot 64位服务器上使用Emacs 24.3,cider 20131221和Leiningen 2.3.3 . 我已经买了Clojure ProgrammingClojure Data Analysis Cookbook并且两者兼而有之 . 我发现它们很有前景,但我迷失在细节中 .

显然,要做的是陷入困境并尝试代码练习和小任务,但对我来说,当前的问题一直是构造,组织甚至只是在Clojure中运行项目的复杂性 . 使用R,我可以使用包含大量代码的纯文本文件,也许还有一两个包含大型项目的常用函数的文本 .

Clojure非常不同,没有Java经验,我很难将各个部分拼凑起来 . Clojure Programming有一整章关于组织和构建项目,但是它非常全面,相反我在Swank上寻找像this answer这样的东西,但是从那以后这些工具似乎已经发生了变化 . 所以这里 .

  • Leiningen除其他外还生成包含项目定义和依赖项的 project.clj 文件 . 我想我明白了 . 我是否可以将此文件用于与 defproject 下面的定义无关的代码,或者最好不要将此文件保持不变并将代码本身放在不同的 clj 文件中?

  • 如果答案是单独保留 project.clj 文件,那么该文件与其他文件之间的关系如何 Build ?是否只是项目文件夹中的所有 clj 文件都被计为项目的一部分?

  • 如何定义项目的主要代码文件'entry point'?假设我在 common.clj 中有 project.cljmain.clj 以及一些辅助函数 - 这三个文件之间的关系是如何定义的?我可以从 main.clj 调用函数,但是如果/当我将项目打包成uberjar时,项目如何知道main是项目的核心?

  • 如果我有多个 clj 文件,导入函数的最佳方法是什么?我已经阅读了 requireuse (以及 importrefer 和......)但我并不完全理解这两个关键字很难找到 . Clojure数据分析手册中REPL的示例通常选择 use . 我发现a similar question但它有点过头了 .

  • 这是更具针对性的工具,但由于Emacs似乎被广泛使用,似乎可以公平地问:在上面给出的(例如) main.clj 示例中,运行少量代码的工作流程是什么?目前我只是在Emacs中打开 main.clj 文件,执行 M-x cider-jack-in Build REPL,在REPL中进行实验,然后当我想尝试一些时,我选择整个缓冲区并从CIDER菜单中选择 Eval regionC-c C-R ) . 这个标准操作程序还是完全错误的?

  • 是否有定义命名空间的约定?我想我明白命名空间可以涵盖多个 clj 文件, ns 用于定义命名空间 . 我应该在每个代码文件中明确定义名称空间(在开头)吗? Clojure Programming有一些建议,但我对其他用户的输入感兴趣 .

  • Clojure编程说“当命名空间包含破折号时,在文件名中使用下划线 . 非常简单,如果您的命名空间是 com.my-project.foo ,则该命名空间的源代码应位于 com/my_project/foo.clj 的文件中” . (编辑如this useful answerthis one中所述) . 这种限制永远不会发生在我身上 . 在命名命名空间和变量方面还有其他问题吗? R经常使用变量名称中的点,但我想在Java连接中通常应避免使用点?

2 回答

  • 1
    • 不,除非你知道自己在做什么,否则不要将实际代码放在那里(例如,从本地git存储库生成defproject的版本号,就像在juxt的存储库中一样)

    • project.clj只是Clojures构建工具leiningen的一个重要参数 . 请参阅此处的示例https://github.com/technomancy/leiningen/blob/master/sample.project.clj . 例如,您可以在 :source-path 中指定与 src 不同的源目录 .

    • 默认为 -main 函数 project.core ,但您可以在 project.clj 中指定各种不同的配置 .

    • require 是首选 . :use 导入命名空间的所有公共,除非您将其与 :only 一起使用 . 要求让你使用 :as 对整个命名空间使用别名,但是 use 使用 :refer 可以产生相同的效果 :only . 请注意,在ClojureScript中, :use 没有 :only 甚至不允许 .

    • 这很正常 . 还有其他组合,例如 C-c C-k 重新加载缓冲区的整个文件 . 如果您发现自己在REPL中输入了太多的表单,而宁愿在单独的缓冲区中编辑它们https://www.refheap.com/22235 .

    • 我喜欢尝试用动词而不是名词来命名命名空间,例如 . G . 我更喜欢 myproject.parsemyproject.interpret ,而不是 myproject.parsermyproject.interpreter 等 . 但这是个人风格的问题 . 编辑:是的,通过文件名和源文件开头的 ns 表单明确定义命名空间的命名 . 有多个源文件定义一个名称空间是不寻常的 .

    • Afaic这是关于命名空间命名的唯一警告 . 你很难提前知道 .

    我喜欢你的“担心”方法 . 你(希望)会发现Clojure,特别是Leiningen在这些问题上几乎没有废话 .

    关于REPL的使用:我在@Mars的回答中看到了你想要以一种可以重复使用你输入内容的方式使用REPL的评论 . 两件事情:

    • 动态开发非常棒,允许您以交互方式测试小型组件或功能,而无需运行为此目的编写的整个程序 .

    • 如果你发现自己在REPL中输入了大量的表格,你打算在以后进行函数或测试,那么我建议在一个不属于项目源的单独clj文件中编辑它们(即不在命名空间中) . 然后,您可以使用this Emacs hack从REPL中的Clojure缓冲区中评估表单 . 理想情况下,将Emacs分成两个窗口(C-x 3),一侧是nrepl缓冲区,另一侧是.clj . 然后使用clj文件中的 C-x C-. 将表单粘贴到nrepl中并进行评估 . 安装说明位于链接处(您的.emacs文件通常位于主目录中) .

  • 5

    @ Igrapenthin的答案很棒 . 以下是其他一些想法 .

    在命名空间上,this tutorial很棒 .

    只是为了澄清#2:不,不要只将.clj文件放在项目的任何地方 . 它们必须在src /下,或者在project.clj中的 :source-paths 之后的向量中列出的任何目录(作为字符串),如果该条目存在 . 然后当你正确的时候剥掉那条初始路径 . )

    一个#3,你需要Igraphenthin 's answer, but why not just start by evaluating expressions in the REPL? I'已经开启和关闭了几个星期的项目,并且它做了很多,但是我的 -main 功能仍然没有工作 . 好吧,你已经习惯了完全可操作的语言 - 你决定了 .

    编辑:无论您是否定义 -main 函数来执行任何操作,您还可以在 ns 语句中放置 :use:require 关键字,以定义该文件的命名空间 . 当您使用 lein repl 启动REPL时,这些将自动被调用,因此通过 ns 关键字提供的任何内容都将在REPL中提供 . 这样,您可以使用以前的工作,但是您可以在REPL中以不同的方式使用它 . (另外,如果你自动加载't like the default name for the file that',你可以用 :main 在project.clj中重新定义它.Igraphenthin提到了这一点 . )

相关问题