Joy (编程语言)

Joy编程语言澳大利亚乐卓博大学Manfred von Thun创立的纯函数式编程语言。Joy基于了函数复合而非lambda表达式。它表现出同30年前出现的Forth语言的很多类似性,这不归结为设计原因而是某种平行的演化和趋同。它还受到John BackusFP语言函数级编程风格的影响[1]

Joy
编程范型多范型: 函数式, 串接式, 面向堆栈
設計者Manfred von Thun
實作者Manfred von Thun
John Cowan
发行时间2001年,​20年前​(2001
穩定版本
2003-03-17
(2003年3月17日,​18年前​(2003-03-17
型態系統强类型, 动态类型
主要實作產品
Joy0, Joy1, "Current Joy", "John Cowan's Joy", "JoyJ (Joy in jvmm)"
啟發語言
Scheme, FP, Forth
影響語言
Factor, Cat, V, Trith

工作机理编辑

Joy是不寻常的(除了函数级编程语言和某些难懂语言unlambda英语unlambda之外),在于它缺乏lambda算子,因而缺乏形式参数。要通过常见例子来说明,平方函数在指令式编程语言C语言)中定义如下:

int square(int x)
{
    return x * x;
}

变量x是形式参数,它在函数别调用时被替换为要计算平方的实际值。在函数式语言(Scheme语言)中这个函数可以定义为:

(define square
  (lambda (x) 
    (* x x)))

这在很多方面有所不同,但仍然以相同方式使用了形式参数x。在Joy中平方函数定义为:

 DEFINE square == dup * .

在Joy中,所有东西都是从堆栈中取得实际参数并向堆栈返回结果的函数。例如,数值5不表示整数常量,转而是将5压入栈顶的一个短程序。

  • dup算子通过压入栈顶元素的副本而简单的复制它。
  • *算子弹出栈顶的两个元素并将它们的乘积压入栈顶。

所以平方函数复制栈顶元素,接着将栈顶二个元素相乘,把最初栈顶元素的平方留在栈顶,这个过程不需要形式参数。这使得Joy很简明,如下面快速排序定义所展示的:

 DEFINE qsort ==
   [small]
   []
   [uncons [>] split]
   [enconcat]
   binrec.

binrec是Joy的多个递归组合子之一,实现了二叉递归。它预期在栈顶有四个引用的程序,分别表示:

  • 终止条件(如果这个列表是“小”的(1或0个元素)则它已经排好序了),
  • 如果终止条件满足做什么(这里什么都不做),
  • 缺省做什么(通过比较每个元素于基准元素而将列表分解成两个半份列表),还有最后的
  • 结束时做什么(在两个排好序的半份列表间插入基准元素)。

数学纯粹性编辑

在Joy中,含义函数是从语法幺半群语义幺半群同态。就是说,符号串接的语法关系直接映射成函数复合的语义关系上。这是同态而非同构,因为这是满射而非双射;就是说,没有符号有多于一个含义,但是某些符号序列有相同的含义(比如dup +2 *)。

Joy是串接编程语言:“两个程序的串接指示这两个程序指示的函数的复合”[2]

它的库例程镜像了ISO C的库例程,尽管当前实现不能用C写的函数轻易扩充。

参见编辑

引用编辑

  1. ^ Manfred von Thun. A Conversation with Manfred von Thun. December 12, 2003 [May 31, 2013]. (原始内容存档于2020-11-09). In the early 1980s I came across the famous Backus paper "Can programming be liberated from the von Neumann style," and I was immediately intrigued by the higher level of programming in his FP. 
  2. ^ Mathematical Foundations of Joy. [2020-04-20]. (原始内容存档于2011-10-07). 

外部链接编辑