内核编程语言(2010)

2021-02-17 18:35:11

此页面版权所有John N.Shutt2004–2012、2015–2021。这是您可以使用的功能。上次修改时间:21年1月24日。

我正在开发一种称为内核的编程语言。内核是Lisp的一种保守的,类似于Scheme的方言,其中的一切都是一流的。 "但是,"您可能会问,“不是所有在Scheme中都是一流的对象?” (很高兴你问到。)不,他们不是。特殊形式的组合器是第二类对象。要借用克里斯托弗·斯特拉奇(Christopher Strachey)对一等和二等物体的原始描述中的短语,它们必须亲自以自己的名字出现。 (Scheme中还有其他几种第二类对象,但是最常见的形式是组合器。)一流的可操作组合器(即,其操作数从未被求值的一流的组合器)的思想已经存在。很长时间。直到1970年代,主流Lisps一直以传统的fexprs命名这类生物,但由于它们与lambda构造的普通程序不正交,因此它们使语言的语义混乱不清。主流Lisps动态调整范围的时间(一种语言功能,对于fexpr造成的问题要比对功能较弱的宏造成的问题更多)。内核通过将经典的lambda构造函数分为两个正交部分来消除非正交性问题,其中一个是一流操作员的内核构造函数。运算符的原始构造函数是一个称为$ vau的运算符,它在语法和语义上与Scheme的lambda几乎相同,不同之处在于它构造的组合器是可运算的。应用程序的原始构造函数(即,其操作数被评估的组合器)是一个称为wrap的应用程序。 wrap接受一个参数,该参数必须是组合器,并构造一个应用程序,该应用程序将其参数(评估其操作数的结果)传递给指定的组合器。可以使用应用程序拆包来提取任何应用程序的基础组合器。还有一个名为$ lambda的运算符的构造函数构造函数,几乎与Scheme的lambda一样-但是内核的$ lambda不是原始的:它可以使用$实现为复合运算符打包。

一流的操作人员并不是内核所能提供的,只是与大多数Lisps最为明显的区别。内核语言的任务是要有一个干净的设计,它源于广泛的设计理念,并通过一系列更具体的设计准则进行了完善-其中之一就是所有可操作的实体都应该是一流的。内核的其他一些简洁(IMHO)功能是统一的复合定义。 (消除了多值回报的动机。)持续保护。 (异常处理"正确执行"。)为动态变量设置了键。 (流体变量“正确完成”。)封装类型。 (强制抽象遇到潜在的输入。受Morris的印记启发。为Kernel的实现Promise提供了与SRFI-45根本不同的味道。)统一处理循环列表。 (否则,循环列表将不会完全是一流的,因为循环列表不能以人们通常期望的对象使用方式,例如通过均等测试。)

内核编程语言的修订版-1报告(2009年10月29日修订)以pdf和压缩后的脚本形式提供。从理论上讲,主要资源是我的博士学位论文,Fexprs作为Lisp函数应用的基础;或$ vau:最终的抽象,用于处理纯净和不纯净的vau-calculi。我在2007年秋季的NEPLS上发表了一个演讲,描述了纯vau-calculi(摘要;脚本;幻灯片(PDF,并非意在打印))。内核报告的附录C中也描述了一个纯vau-caluclus(甚至更浅)(“平凡的fexprs理论”)。如今,寻找内核实现的地方是博客文章《地下内核》,作者曼努埃尔·西蒙尼(Manuel Simoni)的《评估轴》。曾经有一段时间,我有自己的伪原型实现,称为SINK(基于方案的非内核解释器),主要与未扩展的R5R方案兼容;它并没有实现。 ; t不能识别某些内核令牌,因为糖蜜很慢...它的运行速度,比我几年前开始但从未发现完成时间的基于Java的解释器所能说的还要多。我使用SINK调试内核报告的库实现,并使用受保护的延续。从那以后,我怀疑它遭受了腐烂。无论它的价值如何,这里都是一个压缩的tarball:sink-01m10.tar.gz。