约翰·史蒂文森(John Stevenson)在他的Developer的这本产品中帮助我们使用功能性和动态JVM语言迈出了第一步。
我真正喜欢Clojure作为软件开发语言的原因有很多。 其中最重要的是简单性。 语言的语法以及软件的整体设计方法都彰显了简洁性。
Clojure鼓励采用模块化的软件方法,以分解复杂性以明确定义数据结构和可组合的行为。 如果您想到一小撮行为,这些行为会共同产生比自身更大的东西; 这就是Clojure库和应用程序的设计方式。
用Clojure构造事物使我想起了Unix设计。 它的每个方面都做得很好,使您可以轻松地将它们链接在一起。 这种语言的性质鼓励开发人员使用高度模块化的方法来创建Clojure库和应用程序,从而提供了一种简单的方法来轻松构建复杂的系统。
功能设计优雅
在Clojure中,您调用的任何函数在求值时都会返回一个值,即使该值为null。 这意味着可以将函数用作其他函数的参数,从而帮助您设计一些非常优雅的模块化解决方案。
函数调用函数为开发人员提供了一种以简单方式处理复杂性的方法。 这可以通过将行为分解为可以轻松协同工作的轻松组件来实现。 函数和数据结构由相同的语法(同质性)表示,这有助于使您的代码更简单,更简洁,并鼓励开发人员快速提高工作效率。
动态二重奏
Clojure带有一个动态的运行时环境,称为REPL。 这种动态环境使您可以在编写代码时定义和运行代码,从而使该语言更易于学习和尝试。
加上Clojure语言的动态类型性质,这使得开发真正飞起来。 您可以在REPL中快速定义和重新定义函数,如果有价值的话,可以将它们添加到代码库中。 REPL可以加载您的项目代码,并帮助您找到快速扩展和改进代码的方法,而无需花费较长的构建周期。
利用Java平台
在Java虚拟机(JVM)上使用功能语言可以通过使用开发人员已经熟悉的大量库来快速交付项目。
Clojure不必是一门庞大的语言,因为它可以使用许多久经考验的库。 范围从其自身不断增长的库集到数千种现有的Java,Groovy和JRuby库。
由于语言的设计,使用Clojure的许多Java库通常会更容易。 例如,在进行挥杆编程时,使用 Clojure中 的 doto 函数来链接方法调用 会更简单 ,从而避免了很多管道代码。
经过一些非常聪明的人(包括Scala的Martin Odersky和Java Collections的成名)近二十年的编译器和运行时优化之后,JVM是一个非常快速的环境。 在性能方面,Clojure具有典型的C / C ++应用程序,对于大多数应用程序类而言,性能没有明显的区别。
部署Clojure与部署Java一样容易。 一切都被编译为字节码到JVM。 您可以创建jar或war文件,然后将它们放入环境中,就像放置其他Java包一样。 如果未为Clojure设置环境,则可以创建一个uberjar,一个包含您的Clojure应用程序和Clojure库本身的jar。 由于Clojure很小,因此uberjar的大小仍然可以控制。
Clojure的第一步
Clojure入门很简单,只需启动浏览器并将其指向Try Clojure网站, 如图1所示。 该网站为您提供了一个动态的运行时环境,您可以在其中立即开始编写Clojure。 输入的任何代码都会立即进行评估,从而使您的代码立即得到结果。 这为我们提供了一种非常快速的学习语言语法的方法。
但是,等等,我们不知道任何Clojure! 我们将很快介绍该语言的语法,但是如果您想品尝,可以按照tryclj.com上的简单教程进行操作。 所有您需要做的就是 在 tryclj.com 窗口中 键入 tutorial 并按照说明进行操作。 [编者注–即将在Developer中表示。新闻标题]
由于tryclj.com是Github上的一个项目,因此您可以获取一个副本并在本地运行该网站。 该项目是使用名为Noir的Clojure框架编写的(该框架又使用称为Ring , Compojure和Hiccup的其他Clojure框架)。 它提供了Clojure Web项目的示例,可以在您创建自己的Web应用程序时为您提供指导。
TryClj.org是一个很棒的学习工具,您可以在其中尝试使用Clojure语言的语法。 但是,要编写自己的应用程序,您将需要在自己的计算机上设置Clojure开发环境。 可以说,与Clojure一起使用的最简单,最人道的方法是使用一种名为Leiningen(发音为Line – ing – en)的工具。
Leiningen是专门为Clojure设计的构建工具,使您可以在Clojure中定义项目任务。 绝对没有任何地方充满XML的文件! Leiningen还管理您的所有项目依赖项,就像Maven和Ivy一样。 Leiningen还用于在实时环境中部署Clojure项目,创建标准Java jar文件。 如果环境还没有Clojure,Leiningen可以创建一个包含您的应用程序和Clojure的UberJar。
安装Leiningen
从网站上 下载莱宁根的最新安装脚本,称为 lein 。
雷音 安装脚本会下载一些jar文件组成Leiningen项目。 首先将 lein 安装脚本 添加 到操作系统的执行路径,然后运行它以下载最新版本。
Linux / MacOSX安装
假设lein脚本位于“ 下载”文件夹中,请将lein脚本移至主目录中名为bin的文件夹(如有必要,创建bin文件夹):
mkdir〜/ bin
mv〜/下载/ lein〜/ bin
使lein脚本可执行:
chmod + X〜/ bin / lein
如果这是您第一次为使用的登录帐户创建bin目录,则需要重新加载环境设置。 注销并再次登录,或键入命令:
来源〜/ .profile
当您连接到Internet时运行lein脚本,以便它可以下载lein所需的文件。
安装后运行Leiningen
安装Leiningen的相同脚本也可以运行它。 当您运行不带参数的lein脚本时,它将显示您可以执行的任务列表。
in
部署 |
生成jar并部署到远程存储库 |
部门 | 显示有关依赖项的详细信息 |
帮帮我 | 显示任务列表或给定任务的帮助 |
安装 | 将当前项目安装到本地存储库 |
罐 | 将所有项目文件打包成一个jar文件 |
新 | 根据模板生成项目支架 |
绒球 | 将pom.xml文件写入磁盘以实现Maven互操作性 |
代表 | 使用当前项目或独立项目启动一个repl会话 |
跑 | 运行项目的-main函数。 |
测试 | 运行项目的测试。 |
蹦床 | 运行任务而不将项目的JVM嵌套在Leiningen的内部 |
uberjar | 将项目文件和所有依赖项打包到jar文件中 |
升级 | 将Leiningen升级到指定版本或最新稳定版 |
版 | 莱宁根和当前JVM的印刷版 |
带轮廓 | 将给定任务与指定的配置文件一起应用 |
现在您已经安装了Leiningen,您可以使用它来创建您自己的Clojure项目。 您还可以使用Leiningen运行REPL,以为您提供动态编码环境。 接下来,我们将与Leiningen一起探讨Clojure的开发。
REPL与Leiningen合作开发
REPL是一个完整的Clojure环境,您可以在其中编写代码并获得有关其功能的即时反馈。 无需启动单独的编译器或运行构建工具,也无需等待。 您编写的任何正确的Clojure代码都将在REPL中运行。
使用REPL可让您有机会快速试验和检验您的假设。 开发人员继续将REPL用作其开发人员流程的一部分,因为这是一个高效的环境。
一旦安装了Leiningen,就可以使用:lein repl运行REPL, 如图2所示。
图2:从Leiningen启动REPL
REPL启动时,它将加载几个Clojure库,因此您已经可以使用Clojure语言的核心。 REPL还可以在基本Java库中加载,因此您可以使用一些熟悉的对象和API调用。
一旦REPL启动并运行,您就可以使用Clojure语言调用现有函数以及定义自己的函数。 您也可以定义自己的函数将要作用的数据结构。
REPL中的所有内容都会保留在内存中,直到您通过调用Clojure函数exit结束REPL会话为止: (exit)
在REPL中编写Clojure代码
您可以直接在REPL中键入Clojure代码,一旦创建完整的表达式,它将对其求值。 表达式是一段用圆括号括起来的平衡括号内定义的Clojure代码。 一个非常简单的示例如图3所示:
图3:简单地添加Clojure
在这里,我们使用 + 函数将多个数字相加,然后按回车键,对表达式进行求值。 函数的结果显示在我们输入代码之后的行上。 然后提示我们输入更多的Clojure代码。
在Clojure中,您会感到一切都是功能,即使数据结构也像功能一样。 对于语言而言,这是一件很棒的事情,但一开始可能会引起混乱。 正如我们在前面的示例中看到的,调用函数只是将其放在括号之间作为第一项的问题。 这里有一些更多的例子可以尝试。 打印字符串的一种常见方法是使用println命令。 在REPL中使用时, println将在REPL窗口中输出, 如图4所示。
图4:按标准打印
请注意,在打印字符串之后,将返回值nil。 所有函数在评估时都返回一个值。 如果该函数未生成任何值,则默认情况下将返回nil值。 list函数根据给定的参数生成数字的有序列表, 如图5所示 。
函数可以是另一个函数的参数的一部分(也可以是自身的参数)。 在下一个代码示例( 图6 )中,我们首先创建一个列表,该列表是有序的,但没有以数字顺序排列。 通过将list函数包装在sort函数中,将从list返回的值在返回之前进行排序。
图6:使用列表功能的示例
有许多功能可用于列表和其他数据集合。 例如,可以使用函数max从数字列表中找到最大的数值, 如图7所示。
图7:找到最大值
您还具有显式使用其他函数来处理数据集合的函数,例如map和apply 。
map 将采用已赋予的功能,并与集合中的每个元素一起运行它(在本例中为数组,请参 见图8 )。 因此,数组中的每个数字都有 inc 函数映射到它,在返回结果之前依次递增每个数字。
给我看文件
如果您想了解函数的功能,可以在 clojuredocs.org 上搜索它 , 或者查看内置文档 , 如图9 所示 。
使用doc函数,您可以阅读文档中指定为参数的任何函数,甚至(doc doc) 。
由于您仍然在Clojure中发现各种功能,因此您可能不知道所有这些功能的名称。 使用功能find-doc ( 图10 ),您可以搜索REPL提供的所有功能。 如果您正在移动中编程并且没有Internet连接,这也很方便。
图10:find-doc函数的文档
因此,如果我们想使用一个遍历数据结构的函数,则可以使用find-doc列出那些可能对我们有帮助的函数(请参见图11 )。 find-doc函数返回与迭代概念有关的三个函数的描述。
缺少一些功能
如果函数doc不起作用,则可能是该库位于Clojure命名空间中,并且尚未添加到您的环境中。 要使用doc函数和其他几个有用的函数,请将库clojure.repl与函数use一起添加到您的命名空间中(使用'clojure.repl)
告诉我源代码
为了在学习Clojure时获得启发并了解常见的编码方法(包括文档样式),可以使用源函数查看环境所了解的任何函数的Clojure代码, 如图12所示 。
图12:查看函数的源代码
在此示例中,功能文档还包括一个映射,用于定义文档何时添加到Clojure语言中。 您也可以访问Clojure Docs网站以访问定义和源代码
作者简介 :John是Heroku&Salesforce的社区开发人员,并且是伦敦多个社区的积极组织者。 他主持研讨会并就技术主题发表演讲,包括开放源代码项目,开发人员工具,持续交付,TDD和BDD实践以及声明性(功能性)编程(Clojure)。 John还介绍了看板,以帮助个人,团队和组织提高效率。 他是团体学习的坚决拥护者,并鼓励其他人加入社区以促进个人成长。 在业余时间里,如果他不太忙于学习,约翰喜欢在周末骑很多车(200-400公里)。
摘自John's Developer.Press标题为' Clojure Made Simple ',售价为3.99美元。 Developer.Press以低价提供有关Java,PHP,移动技术等的数字格式书籍,可在Developer.Press网站上找到更多信息并查看新版本。
翻译自: https://jaxenter.com/get-up-and-running-with-clojure-106240.html