跳至內容

Joy語言

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
Joy
編程範型多范型: 函數式, 串接式, 面向堆棧
設計者Manfred von Thun
實作者Manfred von Thun
John Cowan
面市時間2001年,​23年前​(2001
型態系統強類型, 動態類型
主要實作產品
Joy0, Joy1, "Current Joy", "John Cowan's Joy", "JoyJ (Joy in jvmm)"
啟發語言
Scheme, FP, Forth
影響語言
Factor, Cat, V, Trith

Joy編程語言澳大利亞樂卓博大學Manfred von Thun創立的純函數式編程語言。Joy基於了函數複合而非lambda表達式。它表現出同30年前出現的Forth語言的很多類似性,這不歸結為設計原因而是某種平行的演化和趨同。它還受到John BackusFP語言函數級編程風格的影響[1]

工作機理

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). 

外部連結