Joy語言
Joy編程語言是澳大利亞樂卓博大學Manfred von Thun創立的純函數式編程語言。Joy基於了函數複合而非lambda表達式。它表現出同30年前出現的Forth語言的很多類似性,這不歸結為設計原因而是某種平行的演化和趨同。它還受到John Backus的FP語言的函數級編程風格的影響[1]。
編程範型 | 多范型: 函數式, 串接式, 面向堆棧 |
---|---|
設計者 | Manfred von Thun |
實作者 | Manfred von Thun John Cowan |
面市時間 | 2001年 |
型態系統 | 強類型, 動態類型 |
主要實作產品 | |
Joy0, Joy1, "Current Joy", "John Cowan's Joy", "JoyJ (Joy in jvmm)" | |
啟發語言 | |
Scheme, FP, Forth | |
影響語言 | |
Factor, Cat, V, Trith |
工作機理
Joy是不尋常的(除了函數級編程語言和某些難懂語言如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寫的函數輕易擴充。
參見
引用
- ^ 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.
- ^ Mathematical Foundations of Joy. [2020-04-20]. (原始內容存檔於2011-10-07).
外部連結
- Official Joy Programming Language Website (La Trobe University) (頁面存檔備份,存於網際網路檔案館)
- Joy homepage mirror (頁面存檔備份,存於網際網路檔案館)
- Freneger, Paul. The JOY of forth. ACM SIGPLAN Notices. August 2003, 38 (8).
- von Thun, Manfred; Thomas, Reuben. Joy: Forth’s Functional Cousin (PDF). Proceedings of the 17th EuroForth Conference. October 9, 2001 [2020-04-20]. (原始內容存檔 (PDF)於2019-11-04).
- Christopher Diggins. What is a Concatenative Language. Dr. Dobbs. December 31, 2008 [2020-04-20]. (原始內容存檔於2012-05-14).
|volume=
被忽略 (幫助) - Apter, Stevan. Functional Programming in Joy and K. Vector. [2011-02-28]. (原始內容存檔於2008-08-28).
- mjoy, an interpreter in Delphi for machine drawing (頁面存檔備份,存於網際網路檔案館) (Subset of Joy)
- Joy of Postfix Calculator App (Subset of Joy)