为玩具项目选择Ruby或Clojure

我们不是一直在树林里吗? 照片©2018由我。

我有一个要为网络构建的项目。 我认识一些Ruby,也了解一些Clojure。 我两个都不擅长。 我应该使用哪个?

我决定用两种语言制作一个简单的脚本来查询Amazon的Product API。 它在Amazon的“书籍”部分中进行搜索并返回结果。 从技术上讲,它是从具有一组经过密码签名的查询的URL中GET的:构建查询,对查询签名,将签名添加到查询中,然后获取结果。 两种语言都有库可以在一行中完成此操作,但是我想使用尽可能少的第三方库来完成此操作。

从理智上讲,我喜欢Clojure。 当它起作用时,它是美丽的。 Clojure在技术上更令人印象深刻。 您可以用它来做不可思议的事情。 此外,您还可以使用它及其Java接口进入一个真正神秘而神奇的世界,例如Graal的Polyglot引擎,在其中可以一起运行R,Ruby,Python和JavaScript。 理论上。 那些语言中最有用的库实际上并不起作用。

但是我用Ruby制作东西的速度更快。 Ruby更有趣。 无论您需要什么,都有一个包装。 该文档很棒。 Ruby是可接受的LISP。 再一次,LISP不是可接受的LISP。

如果它是免费和开源的,Mathematica可能是我唯一的语言。 但是,如果青蛙有翅膀,他就不会撞他的屁股。 不是,永远也不会。

红宝石

非常简单。 我需要的一切都随语言一起出现。 我唯一遇到的麻烦是弄清楚URI对象,以及如何修改其parse属性可以很好地修改整个对象。 那,我花了一个小时试图弄清楚为什么我的签名方法似乎不起作用,当它归结为Amazon希望将空格编码为%20而不是+

Clojure

您不能真正使用空的文本编辑器启动 Clojure项目。 您必须创建一个空的Leiningen项目。 完成几次后,这非常简单。

Clojure文档是一个聪明的混蛋。 我知道,简单并不容易。 尝试向初学函数式编程的人解释以下内容。 Clojure需要一个安静,专注的头脑,而不是只想把事情做好的头脑。

(assoc map key val)(assoc map key val&kvs)assoc(iate)。 当应用于地图时,返回相同(散列/排序)类型的新地图,其中包含键到val的映射。 应用于向量时,返回一个新向量,该向量在索引处包含val。 注意—索引必须为<= data-preserve-html-node =“ true”(计数向量)。

在REPL中,您不能只是通过调用来戳一个对象。 生气了。 您必须打印它,或对其执行某些操作,或者将其包装在括号中。

 (az-key) ClassCastException java.lang.String cannot be cast to clojure.lang.IFn amazon-api-test.core/eval3503 (form-init4298443338166278126.clj:1) 

真气

不要让我开始在Java类实例上调用方法。 我花在Java文档上的时间比任何人在2018年都要花更多的时间,只是想弄清楚如何在没有库的情况下做一些事情。 我没有第三方库就在Ruby中完成了所有工作。 您可以仅使用Java来完成很多工作,但是与真正编写和调试整个Ruby应用程序相比,使用我自己的方法(主要是使用Java的内置库)来编写自己的ISO8601时间戳生成方法的时间更长。 尽管我确实对Java方法语法有些挣扎,但这几乎都不是直接由于Clojure而引起的。 但是打折的是,没有HMac + SHA256编码器。 没有那种。 即使是来自Amazon的Java示例,也需要来自Amazon的软件包才能进行签名。 这不是本练习的重点。 传统的观念是,甚至不理会该死的Java DateTime东西,而只是使用另一个库,该库是一个庞大的第三方Java日期库的包装。

对于Clojure,最终计数为61行,对于Ruby,最终计数为39行。 这是无关紧要的指标; 在LISP中,它们的实现方式不同,分配的工作方式也不同。 Clojure代码包含一个DIY ISO8601时间戳生成器和一个Hmisc + SHA256加密函数 ,因为普通密码包中的buddy中的那个损坏或丢失,或者诸如此类,并且不会将哈希转换为Base64,此外我还尝试减少当事人的依存关系。

总的来说,我认为Ruby赢了。 我一直在平稳地奔跑,整个过程都有动量,血压低,并且在不到一个小时的时间内就完成了,排除了该死的编码问题,亚马逊希望将空格编码为%20而不是+ 。 Clojure缺少帮助者,而从Java中获取帮助者所需的淫秽文件全都导致我血压升高。 那是行不通的。 我明白了为什么Matz和DHH谈论程序员的幸福。 谁知道我是否会真正发表自己的想法,但这仍然很有趣。

  • 红宝石:14:13至16:02。
  • Clojure:16:14至19:29。

后期脚本:前端

但是,您可能会说:ClojureScript呢? 在Clojure中,您可以用相同的语言编写前端和后端! 如果您使用Ruby(以及Rails或Sinatra),则必须编写JavaScript!

在这一点上,JavaScript基本上是伪代码,每个框架在本质上都与其他框架不同,并且都是荒唐的闹剧。 我维护一个用JavaScript编写的iOS应用。 根据您要使用的工具和库,您可以执行所需的任何操作,并根据需要进行编写。 ClojureScript也是如此:我是否要使用om.nextomom.nextfulcrore-frame ,还是我自己的轻量级东西在此处和那里撒上普通的JavaScript以及shadow-cljs ? 它们的工作方式不同,并且可能根本上是不同的语言。 去读一些试剂; 看起来很简单,对吧? 打H比HTML好! 现在去读一些Om。 你知道发生了什么吗? 我也不。 如果我使用Rails,我可能会使用Stimulus。 我不喜欢SPA。

请参阅我的网站上的代码。