Joy編程語言是澳大利亞樂卓博大學Manfred von Thun創立的純函數式編程語言。Joy基於了函數複合而非lambda表達式。它表現出同30年前出現的Forth語言的很多類似性,這不歸結為設計原因而是某種平行的演化和趨同。它還受到John Backus的FP語言的函數級編程風格的影響[1]。
工作機理
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寫的函數輕易擴充。
參見
引用
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.