对这一系列相关问题的某种话语性质提前道歉;我希望答案对于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 Programming和Clojure 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.clj
和main.clj
以及一些辅助函数 - 这三个文件之间的关系是如何定义的?我可以从main.clj
调用函数,但是如果/当我将项目打包成uberjar时,项目如何知道main是项目的核心? -
如果我有多个
clj
文件,导入函数的最佳方法是什么?我已经阅读了require
和use
(以及import
和refer
和......)但我并不完全理解这两个关键字很难找到 . Clojure数据分析手册中REPL的示例通常选择use
. 我发现a similar question但它有点过头了 . -
这是更具针对性的工具,但由于Emacs似乎被广泛使用,似乎可以公平地问:在上面给出的(例如)
main.clj
示例中,运行少量代码的工作流程是什么?目前我只是在Emacs中打开main.clj
文件,执行M-x cider-jack-in
Build REPL,在REPL中进行实验,然后当我想尝试一些时,我选择整个缓冲区并从CIDER菜单中选择Eval region
(C-c C-R
) . 这个标准操作程序还是完全错误的? -
是否有定义命名空间的约定?我想我明白命名空间可以涵盖多个
clj
文件,ns
用于定义命名空间 . 我应该在每个代码文件中明确定义名称空间(在开头)吗? Clojure Programming有一些建议,但我对其他用户的输入感兴趣 . -
Clojure编程说“当命名空间包含破折号时,在文件名中使用下划线 . 非常简单,如果您的命名空间是
com.my-project.foo
,则该命名空间的源代码应位于com/my_project/foo.clj
的文件中” . (编辑如this useful answer和this one中所述) . 这种限制永远不会发生在我身上 . 在命名命名空间和变量方面还有其他问题吗? R经常使用变量名称中的点,但我想在Java连接中通常应避免使用点?
2 回答
不,除非你知道自己在做什么,否则不要将实际代码放在那里(例如,从本地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.parse
,myproject.interpret
,而不是myproject.parser
,myproject.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文件通常位于主目录中) .@ 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提到了这一点 . )