当前位置: 首页 > 知识库问答 >
问题:

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

梁丘德寿
2023-03-14

提前为这一堆相关问题的有些散漫的性质道歉;我希望这些答案将成为Clojure新来者的有用资源。

我刚刚开始学习Clojure,部分原因是这篇文章。我不是一个专业的开发人员,但我有几十年的编程经验(ARexx,VB/VBScript/VBA,然后是Perl和2011年开始的R的日常使用)。我的平台是Windows 7 64位。我在Java1.7上使用Emacs 24.3、苹果酒20131221和Leiningen 2.3.3。0_45Java热点64位服务器。我已经买了Clojurehtml" target="_blank">编程和Clojure数据分析食谱,并尝试了两者。我发现他们很有前途,但我迷失在细节中。

显然,要做的事情是陷入并尝试代码练习和小任务,但对我来说,直接的问题是在Clojure中构建、组织甚至简单运行项目的复杂性。有了R,我可以摆脱一个包含大量代码的纯文本文件,也许还有一两个包含大型项目的通用函数的文件。

Clojure是非常不同的,由于没有Java方面的经验,我正在努力将这些部分组合起来。Clojure Programming有一整章都是关于组织和构建项目的,但它太全面了,因此我发现现在很难梳理出与我相关的信息。我想我正在寻找类似于Swank的答案,但从那时起,这些工具似乎已经开始发展了。这就来了。

  1. 除其他外,莱宁根还制作了一个项目。clj包含项目定义和依赖项的文件。我想我明白了。我是否可以将此文件用于defproject下与定义无关的代码,或者最好保持此文件不变,并将代码本身放在不同的clj文件中

共有2个答案

宰父劲
2023-03-14

@Igrapentin的回答很棒。这里有一些其他的想法。

关于命名空间,本教程非常棒。

只是想澄清一下,re#2:不,不要只是把。clj文件位于项目下的任何位置。它们必须位于src/下,或者位于项目中:源路径之后的向量中列出的任何目录(作为字符串)中。clj,如果该条目存在。然后在创建名称空间名称时去掉初始路径。这让我发疯,直到我明白过来。(了解更多的人,如果这里有不正确的地方,请纠正我。)

1#3,你需要IGraphenThin的答案,但是为什么不从评估REPL中的表达式开始呢?我断断续续地在一个项目上工作了几个星期,它做了很多,但是我的-main函数仍然没有做任何事情。我只是运行我正在做的任何部分。嗯,你已经习惯了有完全操作提示的语言——你决定吧。

编辑:无论您是否定义-main函数来做任何事情,您也可以将: use:要求关键字放在为同一文件定义命名空间的ns语句中。当您使用lein repl启动REPL时,这些将自动被调用,因此您通过ns关键字提供的任何内容都将在REPL中可用。这样,您就可以使用以前的工作,但是您可以在REPL中以不同的方式处理它。(此外,如果您不喜欢自动加载的文件的默认名称,您可以使用: mainproject.clj重新定义它。伊格瑞森暗示了这一点。)

卫高明
2023-03-14
  1. 不,除非您知道自己在做什么,否则不要将实际代码放在那里(例如,从本地git存储库生成defproject的版本号,就像在juxt存储库中一样)
  2. 这个项目。clj只是Clojures构建工具leiningen的一个重要参数。请参见此处的示例https://github.com/technomancy/leiningen/blob/master/sample.project.clj.例如,您可以在:source path中指定与src不同的源目录
  3. 默认值是项目中的-main函数。core,但您可以在项目中指定各种不同的配置。clj
  4. require是首选:use导入命名空间的所有public,除非您将其与:only结合使用。Require让我们使用别名作为整个命名空间的:as,但是您可以通过使用:仅使用:refere获得相同的效果。请注意,在ClojureScript:不使用:甚至不允许仅使用
  5. 这是正常的。还有其他组合,例如C-C-k来重新加载缓冲区的整个文件。如果您发现自己在REPL中输入了太多表单,而希望在单独的缓冲区中编辑它们https://www.refheap.com/22235.
  6. 我喜欢尝试用动词而不是名词来命名名称空间,例如,我更喜欢myproject。解析myproject。在我的项目上解释。解析器myproject。口译员等,但这是个人风格的问题。编辑:是的,通过名称空间的文件名和源文件开头的ns表单显式定义名称空间的命名。由多个源文件定义一个名称空间是不常见的
  7. Afaic这是关于名称空间命名的唯一警告。你很难事先知道

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

关于REPL的使用:我在@Mars-answer下看到了你的评论,你想以一种可以重复使用你输入内容的方式使用REPL。两件事:

  1. 动态开发非常棒,允许您以交互方式测试小组件或函数,而无需运行为此目的编写的整个程序
  2. 如果您发现自己在REPL中输入了巨大的表单,并打算稍后将其分解/重新组合为函数或测试,我建议您在一个单独的clj文件中编辑它们,该文件不属于项目源(即不在命名空间中)。然后,您可以使用此Emacs hack从REPL中的Clojure缓冲区中评估表单。理想情况下,将Emacs拆分为两个窗口(C-X3),一边是nrepl缓冲区,另一边是内存。clj在另一边。然后使用C-xc- ,以将点处的表单粘贴到nrepl中并进行评估。安装说明位于链接中(您的.emacs文件通常位于主目录中)

 类似资料:
  • 问题内容: 假设我有3张桌子,每张桌子都与另一张桌子相关, 当我需要从每个表中获取一列时,如何组织(内部联接)会有所不同吗? 换句话说,我可以将(table2)放在(From)之后吗? 问题答案: 对于大多数查询,顺序无关紧要。 INNER JOIN既具有关联性又具有可交换性,因此表顺序无关紧要 SQL是声明性的。也就是说,定义查询的方式不是优化器的工作方式。它不会像您编写时那样逐行执行。 那就是

  • 我要开发java系统,它由三个应用程序组成。这些应用程序使用相同的包。如何在IntelliJ IDEA中组织这个项目?必须在项目中所有资源都组织在一个包层次结构中,还是在库中使用不同的项目。你能告诉我专业的解决方案吗?

  • 我试图在没有Clojure项目的情况下从emacs执行“苹果酒杰克”,我只是想运行Clojure REPL。但我发现苹果酒正试图运行,而不是,它没有引用我的。当我尝试Clojure项目时,它通常与一起工作。 我想知道这有什么原因,即使当我在码头没有Clojure项目的情况下尝试时也没有问题,我希望苹果酒可以做到这一点,并且有一种方法可以在没有Clojure项目的情况下通过苹果酒运行Leininge

  • 一个人打开网站上的页面来执行质量控制任务。在一个页面上,当用户点击开始按钮时,质量控制活动就开始了。在另一个页面上,活动在页面加载时开始。 一旦人员: 完成任务, 另存为不完整,或 只需关闭浏览器窗口 结束时间可以在质量控制任务开始后10秒到30分钟内的任何地方出现。 问题:如果您有一个包含ActivityID、StartTime和EndTime列的表,那么当更新现有记录的操作发生在插入记录的存储

  • 问题内容: 我有一个用Go语言编写的运行时间较长的服务器。Main会触发执行程序逻辑的多个goroutine。在那之后主要没有什么用。一旦主程序退出,程序将退出。我现在使用的使程序运行的方法只是对fmt.Scanln()的简单调用。我想知道其他人如何阻止main退出。以下是一个基本示例。在这里可以使用哪些想法或最佳做法? 我考虑过创建一个通道并通过接收该通道来延迟main的退出,但是我认为如果我的

  • 如何从matlab运行clojure脚本? 我尝试了以下方法:使用jdk 1.7运行matlab,然后调用java 在matlab中,设置类路径并使用clojure编译器 这里有个错误: 当我编写运行clojure的java类时,一切都可以从控制台运行,但不能从matlab运行。请给出建议。