这是我的--已经有prolog-y(Erlang)、algol-y(Elxir)和Lisp-y(Lfe)语言的BEAM需要一个APL-y语言WUT,看起来就像这篇文章顶部的图片。
APL-它代表另一种编程语言,想象一下它的核心部分,嗯?-是一种设计用于表达的60年代的旧语言。
问得好--在我们大口大口地吃之前,让我们先从原因说起。编写一种新的编程语言的唯一原因是能够做得更好/更快。
很久以前,我受雇于Basho,不得不做他们的编程挑战。这家公司现在已经破产了,我们来看看:
版本向量是事件的简明表示,用于跟踪对分布式系统中的数据项的更改。您可以在此处(http://en.wikipedia.org/wiki/Version_vector),和此处(http://haslab.wordpress.com/2011/07/08/version-vectors-are-not-vector-clocks/).))阅读有关它们的更多信息。附件是一份档案。每行是包含两个版本向量{VC1,VC2}的二元组。版本向量被建模为二元组列表,VC=[{ActorId,CountInteger}]。第一个条目是系统中的参与者,在本例中是一个8字节的Erlang二进制<;<;A、B、C、D、E、F、G、H&>。第二个条目是一个正整数,表示时钟汇总的该参与者的最新事件。如果在B中汇总的每个事件也在A中,则版本向量A下降版本向量B。如果A下降B并且B下降A,则版本向量A和B相等,如果A汇总B看不到的事件,则A和B是并发的。对于所提供的文件,编写一个程序,该程序在表中为每对向量输出一行,使得每一列输出TRUE或FALSE,其中A是元组中的第一个时钟,B是第二个时钟。A下降B|B下降A|A等于B|A与B并发例如:{[{<;<;199,214,110,13,247,118,16,223>;>;,1}],[{<;<;0,88,3,113,66,198,7,52;>;,1},{<;<;199,214,110,13,247,118,16,223>;>;,1}]}生成FALSE|TRUE|FALSE|FALSE,因为第一版本向量是第二版本向量的祖先。用您选择的语言编程。您可以使用您选择的外部库。请向我们提供程序、如何运行的说明以及结果输出。如果您需要进一步的澄清,请发电子邮件给我们。祝好运!。
我的解决方案现在已经上线了--包括测试在内,基本上总共有500行原始代码。那么,在APL中会是什么样子呢?大概是这样(请原谅APL的诸神,因为我是个菜鸟):
矢量1←3 2⍴';a';41';b';42';c';43矢量2←3 2⍴';a';12';c';43';d';99 IsSameShape←{^/((⍴⍺)=(⍴⍵)}...。(这里需要一个if)IsEqual←{+/(⍺[;1]=⍵[;1])^(⍺[;2]=⍵[;2])}执行元1←向量1[;1]执行元2←向量2[;1]共享1个←向量1[(执行元1∊执行元2)/⍳⍴执行元1;2]共享2个←向量2[(执行元2∊执行元1)/⍳⍴执行元2;2]Is2。(此处需要If)DoesDescend←^/((Shared1⌈Shared2)=Shared1)。
(您不能在我写这篇文章的浏览器内REPL中进行流控制,所以Ooooo…。。这个版本可能也有点长,而真正的APLer可以做得更短。)
APL被设计成如此富有表现力,以至于整个程序都可以写在一个页面上,并且程序员可以掌握它们的结构。这个Prezzo为APL巧妙地提供了理由,如果没有它,我就不会写这篇博客文章。一定要读一读--它让我大吃一惊。
编码示例是CRDT(收敛复制的数据类型)的关键部分,其中一篇CS论文的样本可能会给出一个线索,说明为什么在APL中它是如此简短,因为它都是基于集合的数学:
APL被设计成具有表现力-并向开发人员公开了许多集合操作-它可以快速编写类似CRDT的东西,因为它就是这样设计的。一旦您理解了看似奇怪的语法,它实际上是一种非常简单的语言。
请记住,我的APL经验是在飞机上阅读4个小时的手册,并为另外4个SO:1天的经验最多编程。
相比之下,当我在二郎岛做这件事时,我有11年的时间。
Riak还有许多其他棘手的问题,这些问题有着优雅的需求陈述,但是在用Erlang编写时,其实现具有相当大的意外复杂性。
首选列表-从群集读取数据的位置,特别是机架感知和保证写入多个数据中心等内容。
APL中的一项核心技术是获取两组信息并用它们生成布尔矩阵,然后应用一组规则将该布尔矩阵简化为单个布尔值-一个决定,是/否。从本质上讲,它是一种业务规则语言。
我亲爱的朋友玛丽·凯恩(Mary Kane)告诉我,当她离开学校加入爱尔兰人寿时,她接受了APL程序员的培训-获取一组精算表,将个人数据应用于这些表,并将生成的布尔矩阵缩减为商业决策、买卖、定价、计算回报等。
电子表格用户将熟悉此模式。作为一种业务功能,电子表格在很大程度上是静态数据的大型集合,在存在场景数据的情况下,这些数据被映射到布尔矩阵,然后被简化为决策。
关于电子表格用户实际使用哪些函数的著名论文非常清楚地说明了这一点。他们把每个电子表格都倾倒在一家大公司和一个政府部门,然后在其中使用指纹功能。结果是赤裸裸的:SUM,VLOOKUP和IF对于胜利:
所以基本上就是把电子表格变成商业程序。(你们中的一些人会知道,这个话题长期以来一直与我息息相关。)。
有时你只是怀上了一个完整的程序-你可以突然看到它的实现,就像从蓝天上一样,你只需要用手指把它吐出来-这种APL方言就是这样。
但是我真的有太多的事情要做,因为我有一份新的工作,而且都不能做这样的事情。如果有人喜欢,我可以写下我会怎么做;-)