APL - 一瞥天堂(2006年)

2021-06-13 00:37:32

本文件是为2006年6月22日的会议创建的,由AFAPL组织,协会Francophone Pour La Promotion du Langage APL:专门为我们的朋友Henri Sinturel致力于我们的特别会议。

本次会议不是为语言精通的人设计的:许多年来,他们的需求已经满足,我没有任何教导他们。我只是试图向那些不知道它的人展示这个有吸引力的智力工具,希望能够制作一个或两个愿意推动它的皈依者。

实际上,以下呈现是最重要的,以构建两代之间的桥梁:

“Diplodocus”一代熟悉PC之前的信息技术和屏幕的出现(记住,他们是同一个人知道掌握的卡片!)并且谁在APL中发现了处理大型计算机无法处理的所有问题的手段在合理的时间内。这一代就在灭绝的路上。

仅仅了解微型计算机,互联网和超文本的一代;他们被提升的那些,因为他们的Schooldays和谁想想一切都可以用三次点击鼠标来完成大量帮助。

但要描述APL语言,无论是在3或30页中是否难以描述网球匹配或海鸥的飞行:书面文件无法匹配实践经验。因此,以下页面仅给出了整个财富的非常有限和局部的视角。

APL财富的丰富是一瞥天堂。这是你,亨利!

我希望保持对APL的精神以及多年来受到称赞和促进它的人的热情。我将尝试回复最常见的问题,最常见的批评,但我不能涵盖辩论的各个方面。所以我邀请所有关于语言的人在一个电脑屏幕上用一小时花一个小时。

在以下页面中,为了最大限度地,用户缩小的文本缩进,而计算机的响应则以左边的余量开始。

第一个惊喜是,乘法由其适当的符号×而不是可憎的星星*,它在所有其他计算机语言中占有平。对于部门也是如此。

要创建一个变量,它足以键入所选名称并按箭头显示,←将其赋予以下值或值。

Vat←19.6⍝阅读为:增值税获得19.6岁←1952 1943 1986 2005

要了解变量的内容,它就足以键入其名称。

它是APL的特征,即它可以同时在两组相同“形状”组上同时操作。例如,下面有两个变量,5个产品的价格列表和每个产品的数量:

当两个变量乘以一起时,它们是乘以项的乘以,以产生相同的形状: 这种全球方法消除了大多数大多数目前的语言中的载重节目的大部分“循环”。 对于相同形状或尺寸数量的值阵列,此属性仍然如此。 因此,销售总监可以在未来6个月内为4个产品的销售预测,并将其分配给可变预测。 在6个月结束时,他可以将稍微不同的实际值分配给变量实际。 预测 Actual150 200 100 80 80 80 141 188 111 87 82 74300 330 360 400 500 520 321 306 352 403 497 507100 250 350 380 400 450 118 283 397 424 411 409 50 120 220 300 320 350 43 91 187 306 318 363 很明显,我们的董事的第一反应将是评估差异,他可以通过写作非常轻松地实现:

实际预测¯912 17 2¯32124¯234414414444 4414416 47 44 11¯4183444414442

请注意,标志是数字的一部分。否定值高减去区分负值从减法的迹象。

为了通过传统的计算机语言获得类似的结果需要许多指令,它隐藏了术语编程后面的计算对象。例如,这里是人们在帕斯卡中写的:

啊,啊,相信它与否,人们可以在法国大学设施的核心中找到,这些人认为这是一个最简单的方式,那些复活着名的阴影马克西姆:[跨越1960年代法国邪教动画系列,据谷歌]:为什么一个人可以让它变得复杂了?

我们已经看到APL在两个相同形状的两个变量之间工作;它还在这种变量和单个项目之间工作,该项目被称为标量。

如果希望计算到上述可变价格的总共19.6%增值税,则就是这样的情况。

无论是写入价格×0.196还是一个写入0.196×价格结果都是相同的:

人类的智慧并不局限于四五个基本操作,尽管这是大多数,即使是最现代化的编程语言也是如此。 因此,APL,Kenneth E.Iverson的创造者,因此添加到所有通常符号的集合中的所有新的集合: 函数最大值的符号返回两个数字的距离越大,或者通过项目比较项目的两个数字数组。 还有一个可能期望的,最小的符号。 75.6÷87.387.3 11 28 52 14⌈30 10 50 2030 28 52 20 APL支持大约70个符号。 因此,在两种方式中定义某些符号,可以在对确切数量的长度争论。 这没什么可担心的:一些符号熟悉(例如×或÷或再次+和 - ,也是很多其他的人)。 这不是APL的特殊性; 在代数中,我们熟悉使用与减号一样常见的符号,以两种方式使用。

在表达式A = X-Y中,表示操作减法,而在A = -Y中,它是逆操作的结果,其改变了数字的符号。 第一个表格称为二元使用符号。 第二种形式称为Monadic使用符号。 在APL中是相同的,其中大多数符号都可以有两个含义。 例如,为了找到对象的形状(尺寸),一个人使用希腊字母⍴(RHO),这可以在其Monadic使用中读取“形状”。 ⍴价格⍝monadic使用:价格包括5件物品5⍴预测⍝monadic使用:预测包括4行6件4 6 首先是给出表的形状:4 2(4行为2列),然后是表格的内容:25 60 33 47 11等 因此创建了一个新的变量标签,这也是如何制作变量预测和实际的。

在APL中,一个给出名称向量到值列表;这可能由价格和数量等数字组成,或者像&#39这样的字母;曾几何时'一个调用两个维度的表,如预测或标签是矩阵,以及单个值,一个数字,如456.18或单个字母,如' q'一个标量。

那么我们必须做些什么来锻炼总数?数学家很久以前设计了符号σ,始终使用上面和下方的索引的漂亮集合,这与基本文本处理并不是很兼容,这必须在单线上放置符号。

简单不是吗?第一项和最后一项的指数是什么?这给出了数据的所有项目,而不提及它们!

一个人谈到加上可变成本的加号。为了更好地了解该过程:

当我们编写+ / 2145 18 27的指令时,它就像我们写了21 + 45 + 18 + 27 + 11以获得总和122,就像我们在值之间插入符号+一样。

但是,如果我们写×/ 21 45 18 27 27 11它就好像我们已经写了21×45×18×27×11并获得了产品5051970

同样,如果我们写⌈/ 21 45 18 27 11它就好像我们写了21‰45‰18⌈27⌈11所获得的第45件

另一个符号(+ - ×⌈>⍴...)代表功能(添加,减法......最大...形状等)。

我们可以说,随着函数(或节目名称!)的符号,减少允许进行许多不同的操作,因为它是左边的符号:这是一个很大一般性的想法。

只是思考:实际上,在数学中,我们发明了Σ的总和,π为产品,最小和最大值,最大值,以及更值得注意的inf(下限)和sup(上限)!

APL在其最基本的版本中包含六个数学运算符,并在该文档中使用的Dyalog APL版本中的九个数学运算符。

我们必须通过另一个表达式划分:首先是值的总和:+ / val,它给出218的值,其中值为218:⍴val,它给出了7,计算可以写入单个公式:(+ / val)÷ (⍴val)

因为它很可能我们经常想要进行这种计算,因此优选以程序的形式存储该序列。

定义的函数是由构建它们的语言的特征生成的,使得它们可以以与称为原始函数称为原始函数的符号(+ - ×⌈>⍴...)相同的方式使用。

它超出了本文档的范围,以解释如何定义此类程序:已说明哪个,它将看起来像以下内容: 平均值是程序名称。 v表示定义为正确参数的值列表。 R表示计算结果,该结果将在最后返回。 印刷标志∇(调用del)标记程序的打印形式的开头和结束。 返回我们的数字矢量:val←22 37 41 19 54 11 34 Val22 37 41 19 54 11 34 VAL [2 4 7 1 4]⍝注意提取相同的项目两次两次,两次34 22 19 当然,以相同的方式可以修改由其索引指定的一个或多个val,提供了尽可能多的值,因为有些项目来修改,或者所有(以粗体修改的项目)修改或单个值): 通常需要从值列表中提取第一个项目,例如第一个5.没有什么可以更容易:

但是如果需要从长列表中提取前500项,则键入1到500的整数是自然不可能的。 这就是为什么APL已经给出了符号⍳(iota),它生成第一个n整数的集合。 因此,代替写入1 2 3 4 5 6 7 8,足以写入⍳8。 并提取大载体的前500个术语,可以写大[⍳500] 业务的二十个薪金分为三个层次类别,表示简单1 2 3。 一个分配给两个变量的薪水和这些工资的类别; 这里显示的一部分: 工资←4225 1619 3706 2240 2076 1389 3916 3918 4939 2735分类←3 1 3 2 2 1 3 3 3 2 他们从不想要升级这些工资吗? (我们的贫困世界都有什么来!)。

谣言达到我们的计划:根据以下规模,他们希望每个类别的增加百分比增加: 我们创建一个包含上述三个速率的变量,回顾我们可以通过单个数字划分三个数字: 然后,由于第一个薪水在第3类中,所适用于它的速率是: 首先,前五个工资分别在3 1 3 2 2类别中,需要以下升级: 拥有20个税率足以乘以20个工资来获得个人升级等级: 最后,通过添加它们,一个人会知道它会花多少业务: 此表达式可以作为最简单的英语读取:薪金的总和乘以根据类别的税率

这个例子清楚地表明,除了那些已经占据了40年的信息处理之外,还有一些方法,否则,唉,仍然非常罕见。 APL引入的这种差异和原创性是主要的功能。他们为练习它的人的公开和欢迎智力。

APL利用二进制数据使用。它通常是通过=或&gt等关系的函数创建的。

薪水> 30001 0 1 0 0 0 1 1 1 0 1 1 0 0 1 1 0 0 0 0实际>预测0 0 1 1 1 01 0 0 1 0 01 1 1 1 1 00 0 0 1 0 1

一个立即看到有利的结果。这是一个主要的新颖性,即它是我们知道的唯一计算机语言,其具有六个关系功能,以其传统的数学形式表示:< ≤=≥> ≠

当然,其他语言管理某种方式,但它看来,在21世纪初,并不完全不合理地要求不等式≥不应代表=>并且那个≠不应由恶魔般的<>

自然可以使用布尔代数的所有功能在这个二进制数据上运行,而且,使用的符号是熟悉的,全世界,所有国籍的数学家:

因此,如果我正在寻找第3类的人,其薪水不到4000欧元,我可以写:

(类别= 3)∧(工资< 4000)0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 0 1 0 0 0 1 事实上,APL提供了布尔代数的所有功能,包括不熟悉的管理者和NAND(独家或独家)的某些功能,但在电子自动化中非常有用。 顺便提及,独占或(有时称为XOR)可以简单地≠,因为符号都像独占或(不两者)一样: 最后:这些二进制载体可以根据我们描述的,而且还可以用于新颖的目的,作为用于贬值和选择的好工具。 通过以下表达式发现哪些工资小于2500欧元: 工资< 25000 1 0 1 1 0 0 0 0 0 0 1 1 0 0 1 0 1 0 很容易添加所有1s和0s来计算多少人赚取少于2500欧元:

人们还可以使用二进制矢量作为“蒙版”,以从其他数据中选择与二进制1相对应的那些项目: 1 1 0 1 0 0 1/23 55 17 46 81 82 8323 55 46 83 该操作称为压缩,特别适用于从符合给定标准的可变项目中提取。 例如,要在第2类中显示薪水,写入: 要更多地练习我们的技能,让我们在我们的变量Val中找到数字大于35的位置。 Val22 37 41 19 54 11 34 VAL> 350 1 1 0 1 0 0⍴VAL7⍳⍴VAL12 3 4 5 6 7 Val> 350 1 1 0 1 0 0⍳⍴val12 3 4 5 6 7 一个人看到,如果一个人消除(通过压缩)对应于零的术语,以便保留对应于1的那些,则一个容易获得所需的位置:2 3 5.因此,工作可以如下完成:

这是类似的用途,但应用于文本数据:在短语中找到“a”的位置;该方法是相同的。

短语←'阿根廷探戈不是时尚' (短语=' a')/⍳⍴phrase1418 34

自豪地找到了所有的'A的,我们不妨找到所有元音。

唉,虽然我们可以写(短语=' a'),因为矢量可以与单个值进行比较,一个人不能写(短语=' aeiou'),因为这需要项目按项目比较39字母和#39; AEIOU'只有5个。

嗯,可以使用39个其他字母比较39个字母,或者将它们与一个人进行比较,但不是5。

所以我们必须求助于一个新功能:成员资格表示ε,也用于数学。

通过二进制结果,表达式Aεb示出了变量A的哪个元素(无论它们可以在变量B中),无论a和b的数据的形状,尺寸或类型是什么,都可工作小奇迹!

5 7 2 8 4 9ε34 5 61 0 0 0 1 0' Pissenlit'ε' jardin' 0 1 0 0 0 1 0 1 0 (只有'我和'n'出现在'jardin'。)所以追求我们的询问我们将写: (短语ε' aeiou')/⍳⍴phrase38 1113 1818 23 23 23 23 37 37 37 一个人也可以在矢量和表(矩阵)之间使用成员身份,如下所示(城镇列表是先前创建的变量)。 TOWNSMARTIGUESPARISSTRASBOURGGRANVILLENANTESFRÉJUS城镇ε' 0 1 0 0 0 0 0 0 0 00 0 1 0 0 1 0 0 1 0 00 1 0 0 1 0 0 0 0 0 00 0 0 0 0 1 0 0 0 0 0 请注意,结果与左侧的数据始终与数据相同: 程序员经常对我说,符号ε为他们构成的符号ε是一个无法安全的证据,即APL是一种先进的数学语言,不适合所有用户。 我倾向于同意这是一般认为,是吗?

即使它在60年代开始以来的教育中只使用了教育,这种符号也出现(如果我没有误),作为自19世纪下半叶自19世纪下半叶自“现代”数学装置的一部分。知道我们在21世纪,我们可以说它至少100岁。

更重要的是,当我的老年儿子11岁时,会员资格为7年级数学课程。我可以说,仔细遵循他的学习,它没有比那个课程延迟到后来的任何更大的难度。

换句话说,那些发现会员资格的人无法理解的程序员是不合理的声称在过去100年的11个孩子的权力范围内的事情突然变得过于先进,困难。

在这种情况下,我认为一个人不能把APL放入任何人的手中;特别是这些程序员的人。但这是对APL的公平批评吗?

我们有一个非常有用的方法来寻找传染媒介中的字母或数字的位置,但它有一些小问题我们尚未涵盖。还有另一种方式,它使用符号的二元形式⍳(iota)。

VEC←15 40 63 18 27 40 33 29 40 88⍝载向量VEC⍳29 63 40 33 50⍝值Sought8 3 2 7 11

图29,63,40和33分别发生在位置8,3,2和7中。

第一个惊喜:值40在VEC中发生三次,但只有第一次出现。 如果寻求每个值的响应必须是一个位置; 怎么可能,寻找五个数字,获得七个结果? 第二令人惊讶:值50分配的位置11 ......在包含十个项目的向量中! 这是(二元⍳)的函数索引报告的缺点不存在的方式。 乍一看似乎很奇怪,但实际上它是使这个功能如此强大的特点。 电机制造商决定他将向客户提供目录价格的折扣。 (现在你知道这个例子是虚构的!) 问题是计算可能为住在地区D的潜在客户所要求的折扣率; 例如,D←84。 区域←17 50 59 84 89 Disct←9 8 6 5 4 2 84全部正确:列表中的第4项。 让我们找到此索引位置的当前折扣率:

本客户可以申请5%的折扣; 那挺好的。 一个可以简单地写:disct [seakəd] 如果客户住在任何区域,如75,45或93,则表达面积⍳D将在所有情况下给出响应6和DISCT [6]将始终找到2%的速率。 这种方法的重要性是它是基于矢量的。 假设宣传吸引人群,因此D不再是标量而是一个向量,解决方案仍然有效: D←24 75 89 60 92 50 51 50 84 66 17 89 DISCT [Area⍳d] 2 2 4 2 2 8 2 8 5 2 9 4 没有程序的所有情况都不是“循环”也不是“测试”,读者谁知道其他编程语言的比较将没有困难。 实际上,我们刚写的表达式是“改变参考框架”的算法的示例。 不要恐慌,这个名字是重新调整,但概念是sim ......