MENU

【代码札记】 从零开始的Clojure环境搭建

February 15, 2020 • 瞎折腾

我现在日常开发的主力语言是Java和Kotlin,其中后者可能占比更加多一些,如果可以的话我尽可能的会选择Kotlin来做我熟悉的事情,但是另一种情况,比如尝试我以前未曾涉足过的非Kotlin原生框架(例如DeepLearning4J),我就比较偏好于使用Java,因为通常情况下我可以从框架的文档处很方便的复制粘贴来一些代码跑跑看。

今天闲来无事,决定试试看基于JVM的其他语言。本文将记述我今天搭建Clojure运行和编译环境的一些事宜。

杂谈

在函数式这方面,JVM上Scala勉强算吧,比较纯粹的就是Eta-lang和Clojure了,前者类似Haskell,后者类似Lisp。我是比较偏好Haskell的,但是前者实在是太新了,而且有风评传它对Java原生的调用不是很美,而且为了贴近GHC又不得不做出一些牺牲,但最终又不是原生的GHC。等于它处在了一个JVM和GHC之间很尴尬的位置。不过目前他们成立了一个公司来开发Eta-lang,我决定在等几个版本,万一就好了呢。

而且说起Haskell,我是真喜欢Haskell的写法和理念,不用担心括号叠罗汉,Monad也很酷(虽然我不会用吧,可我乐意学),但是迫使我不得不弃坑(我试图入门过Haskell,有博文为证)的一个最主要的原因就是Haskell的包管理工具stack,遇到一个要求了不同版本GHC的依赖,就要下载一整套GHC,真的用起来的时候代码还没写多少,光是引用了几个依赖,一个200GB的分区就红了,我这笔记本真是撑不住啊。而且看了好久,我发现社区可能还想把这个当作一个特性,遂不得已弃坑了。如果Eta-lang能做好,它是基于JVM的,虽然也兼容与Haskell互相调用,但是我认为这样子就完全可以避开stack来节省我的硬盘空间,毕竟我认为Java没有什么做不到的,编程思想不一样可以自己写接口包装一下嘛。

对于Lisp的印象,我觉得就是一个远古魔法。我确实没有深入了解过Lisp,听闻远古Lisp支持的运算/函数/关键字屈指可数,但是能达到有限状态机那种境界,我觉得是真厉害。但是现在的Lisp,真就是括号叠罗汉。同样是一个2加2,在Haskell里:

2 + 2

加号是中缀函数,可以加括号变为普通函数调用,可是Lisp就不行:

(+ 2 2)

非得用括号包起来才是一个表达式,不然编译器就骂街。且还没有中缀函数的概念。我可能还是不懂Lisp的精髓吧。我买了一本书叫「Living Clojure」,我决定深入的学一学,没事儿用这个做点儿小玩意儿也是好的嘛。但前提还是得先把环境搭起来。

客观条件

我的电脑是Win10,常用的IDE就是Intellij家的IDEA,因为在读大学,所以可以申请到免费的教育版许可。

关于Clojure的IDE,我决定在IDEA的基础上安装插件。我选择的插件是Cursive,他们非常人性的提供了几种不同的许可:

  • 个人许可 - 99刀一年
  • 企业许可 - 不知道多少钱一年,我没细看
  • 非商业许可 - 免费

我选的是后者,因为我还到敢在商业项目中使用Clojure的程度,而且我也保证我不会用非商业许可写用来赚钱的代码。所以我申请的最后一种,有效期是六个月,可以随时申请新的。

【警告】请务必根据你的工作性质购买合适的许可。这个插件也是别人日夜操劳写出来的,大家都不容易,花点钱支持正版没毛病。

其实安装过程挺简单的,直接装上插件输入密钥就可以了。但是我装完了建立好工程准备进REPL耍一耍的时候,IDEA突然提示我:

Dependency resolution error
Error synchronising learning:0.1.0-SNAPSHOT:
Failed to collect dependencies at org.clojure:clojure:jar:1.10.0

我:???

后来我发现这个插件是用的Maven获取的jar文件,m2文件夹中有对应的文件夹了,可是文件夹里还是空的。在其他项目中我的Maven好好的,没有出现过类似的情况。经过一顿排查,确定是网络的问题。遂一通更改settings.xml,又是挂代理又是换Repo的,折腾一溜够。

最终在代理软件中发现端倪:

unknown Socks version: 67

我:???我明明用的http协议啊?

最终发现IDEA的设置里是Socks5协议,而IDEA在调用Maven下载Jar文件时默认把代理设置传给了Maven,后者似乎是不认socks5的样子,反正就是没谈好,导致网络始终不通。

最终在IDEA中改回Http代理,再刷新工程就完美解决问题了。

至此Cursive插件的全部功能都能得以正常运作,等书到了就可以学起来了。

-全文完-


知识共享许可协议
【代码札记】 从零开始的Clojure环境搭建天空 Blond 采用 知识共享 署名 - 非商业性使用 - 相同方式共享 4.0 国际 许可协议进行许可。
本许可协议授权之外的使用权限可以从 https://skyblond.info/about.html 处获得。

Archives QR Code
QR Code for this page
Tipping QR Code