BQN:Marshall Lochbaum的APL变体

2020-08-16 05:08:21

在这里试试吧!在线版目前主要适用于小程序;更多选项请参见running.md。

BQN是APL血统中的一种新的编程语言,旨在消除APL传统中不一致和繁琐的方面,并将伟大的思想建立在更坚实的基础上。BQN面向现有的和有抱负的APL系列程序员,使用它需要对函数和多维数组有扎实的理解。但是,由于BQN侧重于提供简单、一致和强大的数组操作,因此它也应该是学习数组编程和构建更强的数组直觉的好语言。

但BQN被从头开始重新设计,采用了全新的想法,使这些范例更容易使用,更不可能失败。

基于数组的模型使非数组成为该语言的基本部分,并消除了浮点数组和显式框的麻烦。新的数组表示法消除了搁浅的陷阱。

在上下文无关的语法中,值的句法角色由其拼写确定,这使得机器和人类更容易理解代码。

内置功能的新符号允许一目了然地区分基元的语法角色,并旨在使其更加一致和直观。

这是三个字母,恰好与大问题符号中的大写字母相匹配。你可以把它读成“培根”,但除非有双关语,否则建议你避免这样做。

对于更长的示例,您可以深入了解自托管编译器的深渊,或者运行时更浅但更宽的深渊,或者查看用于格式化和突出显示文档文件的更友好的标记处理器。这里还有50个函数的APL历史的一些翻译。

BQN';的大部分功能都涉及多维数组的操作。然而,它摒弃了传统APL阵列模型的许多复杂性。与APL不同,非数组数据是可能的,也是常见的:数字、字符和函数不是数组(请参阅下面的完整类型列表)。这避免了在尝试将标量数组作为基本单位处理时出现的一些困难;特别是,没有浮点,因此值始终不同于包含它的标量数组。这个系统在APL的过去已经在基于名称的阵列理论下被提出。

目前的目的是阵列不会有原型,这样所有相同形状的空数组的行为都是相同的。阵列的不同元素不应相互影响。虽然某些API强制将放在同一数组中的数字转换为可能具有不同精度属性的通用表示形式,但BQN将强制64位浮点精度,并且仅使用与其兼容的表示形式或方法(例如,最多32位的整数)。

BQN语法由表达式组成,在表达式周围有一些组织结构,如赋值、函数和列表表示法。表达式是程序员控制的地方,因此在引入特殊语法之前,设计会尝试尽可能多地使用它们。

这些角色的工作方式与APL中完全一样,函数应用于一个或两个主语参数,1-修饰语在左侧接受单个函数或主语,2-修饰语在两边各接受一个函数或主语。

与APL不同的是,在BQN中,值的语法角色完全由它的拼写方式确定:小写的第一个字母(Name)使其成为主语,大写的首字母(Name)使其成为函数,下划线用于1修饰语(_Name)和2修饰语(_Name_)。下面,函数{𝕎𝕩}将其左侧参数𝕎视为函数,将右侧参数𝕩视为主题。使用函数列表,我们可以制作几个数字的平方根的表格:

⟨ט,√⟩{𝕎𝕩}⌜1‿4‿9┌─╵1 16 81 1 2 3┘。

Bqn';的内置操作也有模式来指示语法角色:1-修饰语(˜?˘⁼⌜‘`)都是上标字符,2-修饰语(∘0⊸⟜⌾⊘◶⚇⎉⍟)都有一个完整的圆圈(两个函数⌽⍉都有虚圈,中间有线穿过)。尽管特殊符号‘、∞和π用作数字文字记数法的一部分,但其他每个内置常量都是一个函数。

与APL函数有显著差异的函数用星号标记。这些条目的链接指向专门的BQN文档,而其他链接指向APL Wiki。

组合器仅控制函数的应用。因为非函数操作数作为常量函数应用,所以一些组合符在传递常量时具有额外的意义。例如,0˜是始终返回0的常量函数,0⊸<;是测试其右参数是否大于0的函数。

{𝔾⁼∘𝔽0𝔾}或{(𝔾𝕩)↩𝕨𝔽0𝔾𝕩⋄𝕩}。

选择ISN';不是真正的组合器,因为它调用函数⊑,而选择Under不是真正的组合器,因为它在末尾有一个撤消步骤。这一步可以使用左操作数的逆(计算下)或其结构属性(结构下)来实现。

其他修饰符控制数组遍历和迭代。在三种情况下,较简单的1-修饰符与广义的2-修饰符配对:在每种情况下,1-修饰符恰好与右操作数为1的2-修饰符相同。

数字允许使用‘表示负号(因为-是一个函数)和e表示科学记数法(或E,因为数字记数法不区分大小写)的典型小数记数法。∞和π可以用作特殊数值。也允许复数,各分量用i分隔。

字符串使用双引号&34;";,字符之间使用单引号';';和#39;。字符串中的双引号可以通过编写两次来转义;如果两个字符串文字相邻,则必须用空格分隔。相反,字符文字不使用转义,因为长度是已知的。

字符⋄和,以及换行符完全可以互换,并用于分隔表达式。表达式可以是列表中的元素,也可以是函数中的行。空节-仅由空格组成的部分-将被忽略。这意味着表达式之间可以使用任意数量的分隔符,并且还允许使用前导分隔符和尾随分隔符。表达式按文本顺序求值:从左到右,从上到下。

列表(一维数组)用尖括号⟨⟩括起来,中间的表达式结果是列表的元素。两个或更多元素的列表也可以用连字字符‿书写。该字符具有比表达式的任何部分更高的结合强度。如果其中一个元素是复合表达式,则需要将其括在括号中。

块是用大括号{}编写的,可用于组合表达式或定义函数和修饰符。内容只是一个表达式序列,其中每个表达式都被求值,最后一个表达式的结果被返回,以便对块求值。此结果可以有任何值,其在调用上下文中的语法角色由以下常规规则确定:函数返回主体,修饰符返回函数。块有词法作用域。

特殊名称𝕨和𝕩(代表参数)以及𝕗和𝕘(代表操作数)放在大括号内。与普通名称一样,小写形式表示主语,大写形式𝕎𝕏𝔽𝔾表示功能。块的类型和语法角色由其内容决定:2-修饰语包含𝕘,1-修饰语包含𝕗但不包含𝕘,而函数既不包含也不包含𝕨𝕩𝕤𝕎𝕏𝕊。如果不存在特殊名称,则该块是直接块,并在其出现时立即求值,结果具有主体角色。

一个修饰符可以计算两次:一次是在传递操作数时,另一次是在向结果函数传递参数时。如果它包含𝕨或𝕩,则第一个求值只记住操作数,并且当参数可用时,仅在第二个求值上执行内容。如果它不包含这些内容,则在第一次求值时执行内容,并将结果视为函数。

所有这些类型都是不可变的,并且不可变类型应该是BQN的默认类型。唯一可能添加的可变类型是命名空间或作用域。

以上正文描述了初步实施目标。在达到这一目标后,语言可能会得到扩展。本节介绍未完全定义但可以添加到语言中的功能。

集合是不同值的无序集合。字典有一组键,并将每个键与相应的值相关联。在某些情况下,这些类型很适合数据;虽然可以使用键和值的数组来表示它们,但是使用正确的类型可以实现更干净、更快的算法。

集合表示法与带括号的列表表示法相匹配,尖括号更改为双击大括号⦃⦄,但集合没有连字表示法。

字典使用尖括号⟨⟩,类似于列表,但不是表达式,而是用:分隔的表达式对。第一个表达式的计算结果为键,第二个表达式的计算结果为相应值。这本空字典写的是⟨:⟩。

字典和集合应该支持它们自己的基元操作集,就像数组一样。出于这个原因,数学中的字形∪⊂⊃⊆⊇没有使用:它们可能需要用于集合操作。

有时,拥有可变类型很有用,特别是当程序的一部分应该在执行过程中保持自己的状态时。作为完整的词法作用域实现的一部分所需的闭包实际上允许这样的事情。如果函数定义并返回显式函数,则该函数可以读取和更改其环境中的变量。由于环境包括为执行外部函数而创建的作用域,因此调用外部函数将创建可通过返回的函数间接访问的可变环境。

命名空间将允许直接访问和操作这样的环境。虽然有可能有创建名称空间的工具,但更简单的机制是添加一个将当前作用域作为变量返回的原语。然后,这个作用域的行为将与返回函数的环境相同,并允许通过点状语法访问成员。

符号是表示程序中名称的变量。符号将使与名称空间的动态交互变得更容易。