當前位置:
首頁 > 知識 > @程序員,為什麼選擇 Racket 語言?

@程序員,為什麼選擇 Racket 語言?

Racket 作為眾多 Lisp 方言中的一種,是一種可編程的計算機程序設計語言 ,同時也是一個程序設計環境。其也曾一度被列入教科書的素材,但是對於這門小眾化語言,是否有必要上手?

@程序員,為什麼選擇 Racket 語言?

打開今日頭條,查看更多圖片

作者 | beau-tiful racket

譯者 | 彼得

責編 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下為譯文:

作為Lisp語言的新手,我曾經迷失在各種對於Lisp的溢美之詞。我甚至不知道其中某些詞的含義是什麼。比如,人們常常說Lisp是另一場影響深遠的啟蒙運動。當然,你怎麼說它都可以。

對於人們來說,有一個更簡單和現實的問題:Lisp對我來說意味著什麼?我此前寫過文章對此進行了說明。我總結和解答了為什麼不了解Lisp語言或特別是Racket語言的人值得花時間去了解它們。

我列出了對於我這個Rocket初學者最重要的9個語言特性。其中,第五個特性是「創建新的編程語言」。這項技術也被稱為面向語言編程,或LOP。

在那之後的幾年裡,面向語言編程已經成為我喜歡Racket的最重要的原因。在此過程中,我也把自己對於Racket的喜歡轉化為行動。除了開發語言之外,我還寫了在線書籍 《Beautiful Racket》。我認為LOP是一項技術,而Racket是一種實現該技術的工具。在該書中,我對於LOP和Racket都進行了介紹。

在工作中,我開發了一種基於文本的編程語言Pollen。我用它來實現我的在線圖書《Practical Typography》和《Beautiful Racket》。在Pollen中,上面的段落會被表示為:

#lang pollen
在鏈接?link["why-racket-why-lisp.html#so-really-whats-in-it-for-me-now"]{nine language features},我列出了對於我這個Rocket初學者最重要的9個語言特性。其中,第五個特性是「創建新的編程語言」。這項技術也被稱 ?em{面向語言編程}, 或者 ?em{LOP}。

另一個例子是brag,一個解析器的生成器(採用lex / yacc樣式),它採用BNF語法作為源代碼。下面是一個簡單的bf語言的示例:

#lang brag
bf-program : (bf-op | bf-loop)*
bf-op : ">" | "<" | "+" | "-" | "." | ","
bf-loop : "[" (bf-op | bf-loop)* "]"
#lang brag
bf-program : (bf-op | bf-loop)*
bf-op : ">" | "<" | "+" | "-" | "." | ","
bf-loop : "[" (bf-op | bf-loop)* "]"

這兩種語言都是在Racket中實現的,可以使用通常的Racket解釋器運行,也可以在Racket IDE(DrRacket)里運行。

重要問題

雖然這本書已經讓成千上萬的人開始了他們的LOP之旅,但是,我有時候還是會擔心自己會陷入被我批評過的Lisp倡導者們曾經陷入過的窘境之中。

如果LOP真的有這麼強大,那麼您也就不需要花幾天時間來學習我這本教程,我也應該能夠很輕鬆地講解它。我應該能夠回答下面的兩個簡單的問題:

  1. 哪些問題最適合用面向語言的編程解決?
  2. 為什麼Racket最適合完成開發語言的任務?

第二個問題很容易回答。但是,第一個問題就不太容易回答。很多人也多次問我第一個問題。我經常用Potter Stewart法官說的那句名言來回答:你看到它的時候,你就會知道。這個回答對那些LOP的好奇者來說已經足夠了。但是,對那些仍然想要更多實際理由的觀望者們,卻不會讓他們滿意。

所以,我將進行一次更有意義的嘗試。請記住,我不是計算機科學系的教授。我不會像他們那樣講解編程語言。相反,我將Racket和DSL用在我的實際工作中。我的目地是以對其他實際用戶有參考價值的方式來闡述問題。(如果我沒有講清楚,請您點擊左邊並發送評論。)

簡短的回答

  1. 面向語言編程實際上是一種介面設計技術。它非常適合於那些需要最少的概念,同時又保持最高的精度的任務。最少的概念=所有的概念都是您允許的,沒有可有可無的概念。最高精度=該概念的含義正是您要表達的意思。沒有固定的模板。除了LOP,其他的技術都做不到。(您如果著急的化,可以直接閱讀適合用LOP完成的這些任務。)
  2. Racket的宏系統使它適用於LOP。宏是定義語言必不可少的工具,它們使編譯器代碼轉換變得很容易。Racket的宏系統比任何其他的都要好。

讀到這裡,我估計得有一半的讀者打算去互聯網發布匿名的評論,對我的上述說法提出異議。在你離開這裡之前,請注意:無論怎麼樣,對我來講都是可以接受的。一方面,LOP和Racket對我的編程效率來說是一個令人難以置信的力量倍增器。我願意與你分享這些知識,讓你也可以從中受益。如果你不接受我的觀點,這些工具依舊是我的秘密武器,這樣我也可以接受。我還可以比其他99.9%的人更有野心、更有影響地從事更有利可圖的工作。

這一切取決於您的選擇。

詳細的解釋

我開始考慮如何回答一個大問題:為什麼很難解釋面向語言編程的好處?

也許是因為當我們談論編程語言(簡稱語言)的時候,我們其實想知道它們是什麼編程語言,它們能夠做什麼。如果簡單地這麼想,我們就很難看到面向語言編程的價值。

但是,如果我們放大我們的視角,把語言看作是人機界面的一部分,那麼我們就更容易看到LOP的優勢。

下面我們就這麼試一試。

特定領域的語言與通用語言

首先,我們先定義一些術語。面向語言的編程(又稱LOP)是通過開發新的編程語言並用新語言編寫程序的方法來解某些編程問題。這些新開發的語言通常被稱為特定領域的語言或DSL。

顧名思義,特定領域的語言是為了解決特定問題而開發的語言。例如,PostScript,SQL,make,正則表達式,.htaccess和HTML都是特定領域的語言。開發這些語言的初衷不是為了解決所有的問題,恰恰相反,人們開發它們只是為了解決某個特定的問題。

與特定領域的語言相對的是通用語言。常見的通用語言包括C,Pascal,Perl,Java,Python,Ruby,Racket等。為什麼這些語言不是DSL?因為人們認為它們能完成通用的計算任務。

實際上,這些通用語言通常都會在某些方面比其他語言做得更好。例如,C擅長系統編程。Perl擅長作為系統管理員的腳本語言。Python適合作為初學者的語言。Racket擅長LOP。每種語言都有它們自己的設計初衷。

特定領域的語言和通用語言也不是一成不變的。例如,Ruby最初是一種通用語言,但通過與Ruby on Rails的關聯,它在很大程度上又變成了一種Web應用程序的DSL。另一方面,JavaScript最初是一個用於Web瀏覽器腳本的DSL。但是現在,它已經像變異的病毒一樣,與它最開始的時候大相徑庭了。

語言是什麼?

如果特定領域的語言和通用語言之間的所有這些都應該被稱為語言,那麼語言的特徵是到底是什麼?

我知道你想說:「好吧,你錯了。HTML不是一種語言。它只是標記。它無法表達演算法。」。或者「正則表達式不是一種語言。它們不能獨立存在。它們只是一種語言中的特定語法。「

我也曾經這麼認為。但是當我更加仔細地研究之後,我發現這些差異其實很微小。對於語言,在三個主要特徵中,我認為第一個是:編程語言本質上是一個交流的媒介,是人類和計算機之間以彼此都可以理解的方式進行交流的符號系統。

「符號」意味著語言包含語法; 「可以理解」意味著語言具有附加到語法的含義(更專業的說法是語義)。 該定義涵蓋了所有的通用編程語言和所有的DSL。(但是不包括所有的數據流,後面我們再講)

(順便說一句,雖然人們通常一起使用「編程」和「語言」這兩個詞,但是,這裡所說的語言,並不僅僅是指人們用它來對計算機進行編程。有時候,計算機也用它來和我們交流,有時候計算機之間也用它來進行交流。從嚴格意義上講,我們不應該排除語言的這些應用場景。但是,實際上,我們通常用編程語言做的就是編程。 )

我們再來說一下HTML。它能夠告訴計算機,更確切地講是瀏覽器,如何來繪製網頁。它是人和計算機都可以理解的符號系統(包括尖括弧,標籤,屬性等)(charset屬性用來定義編碼的字符集,p標籤用來定義段落,等等)。

HTML的代碼片段如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>My web page</title>
</head>
<body>
<p>Hello <strong>world</strong></p>
</body>
<html>

如果你對HTML是一種編程語言的說法有異議。我們可以用Python來輸出我們的頁面。Python是一種真正意義上的編程語言,你應該沒有異議吧?

print "<!DOCTYPE html>"
print "<html>"
print "<head>"
print "<meta charset="UTF-8">"
print "<title>My web page</title>"
print "</head>"
print "<body>"
print "<p>Hello <strong>world</strong></p>"
print "</body>"
print "<html>"

顯然,這種區別對待HTML和Python的做法是矛盾的。Python化只是增加了複雜性並提供了模板。還有,從控制Web瀏覽器的角度講,Python唯一有趣的語義內容就是嵌入在HTML中的內容。出於一致性考慮,我們可以得出結論:HTML雖然比Python更簡單且不靈活,但是它確實是一種編程語言。如果你認為Python是一種編程語言而HTML不是,那麼,我們應該很容易推斷上面這個Python片段是程序,而上面的HTML代碼則不是。

嵌入式語言

上面的HTML片段是我們特意設計的。但這種將DSL嵌套在另一種語言中的做法是普遍存在的。以這種方式使用的語言被稱為嵌入式語言。它們代表了最常見的面向語言編程。作為一名程序員,即使您不知道LOP的正式名稱,您也已經用了很長時間。

例如,正則表達式。我們可能不會認為正則表達式是一種獨立的語言。但每個程序員都知道下面這段代碼的含義:

^fo+(bar)*$

與HTML一樣,我們可以用宿主語言的符號編寫等效的字元串匹配計算。例如,Racket支持方案的正則表達式(SRES),它們是使用正則表達式S-表達符號。上面的模式會這樣寫:此外,如果您將上面的正則表達式輸入到您喜歡的編程語言中,這個表達式就會運行。這種行為的一致性是因為正則表達式本身就是一種嵌入式語言,它由POSIX定義。

使用S-expression來定義正則表達式。上面的正則表達式可以表示為:

(seq bos "f" (+ "o") (* (submatch "bar")) eos)

我們還有一個隨處可見的嵌入式DSL:數學表達式。每個程序員都知道下面的表達式的含義:但是,Racket程序員很少使用SRE。它們太長而且難以記住。

(1 + 2) * (3 / 4) - 5

你不能把編寫HTML稱為編程數學表達式本身並不能開發有趣的程序。我們需要將它們與其他語言結構相結合。但與正則表達式一樣,這是符合人體工程學和實用的考慮因素。數學表達式有自己的符號和含義,人類和計算機都可以理解,因此它也是一種單獨的嵌入式語言。

不能將 HTML 稱之為編程

我認為編寫HTML就是編程。我認為HTML(還有正則表達式和數學表達式)應該被認為是基本編程語言。這就意味著編寫HTML(還有正則表達式或數學表達式)都應該被認為是基本編程。

對於上面的論點你沒有必要太在意。如果有誰只知道HTML和算術,就大言不慚地在LinkedIn上將自己標榜為「程序員」的話,大家都會覺得這很過分。這其實是另外的一個話題,即我們通常所說的「程序員」一詞在就業市場中所代表的含義。但這不是我們在這裡需要關注的問題。

圖靈完整性

前面我對編程語言的解釋,如果你覺得不太滿意,這可能因為你認為一個真正的編程語言必須能夠表達所有可能的演算法-也就是說,它必須具有圖靈完整性。

我理解大家為什麼這麼想。因為每一種通用編程語言都具有圖靈完整性。

問題在於圖靈完整性是一個比較低的標準。這只是衡量語言的一個技術指標,但是它並不決定現實世界中的語言應該是什麼樣的。例如,正則表達式也不具有圖靈完整性,但是它卻具有較高的使用價值,因為它們用最少的符號表達了具有廣泛含義的演算法。HTML也不具有圖靈完整性,但它卻能有效地控制瀏覽器的展示和行為。與正則表達式和HTML形成明顯對比的是bf語言。它雖然具有圖靈完整性,但是,即使是最簡單的任務也需要大量難以理解的代碼。

成為語言的限制條件

到現在為止,我對編程語言的定義還沒有包含全部的內容:

  • 二進位格式的數據不符合語言的要求。例如,一個jpeg文件。雖然計算機可以,但是人類卻無法理解它。還有PDF文件:如果你打開一個PDF文件,你會發現一些可讀的內容。但是這只是PDF的一部分。人們還是沒有辦法用PDF格式的消息來進行交流。
  • 純文本文件不是語言。如果有一個包含荷馬史詩中伊利亞特的文本文件,我們人類是可以閱讀和理解。雖然計算機可以輕鬆處理文本文件,比如列印其中的內容,但是,文件中的文本內容對計算機來說卻是難以理解的。
  • 用戶圖形界面不是語言。它們是符號系統(由文本和圖像組成)。但是它們只能被人類所理解。雖然計算機能繪製用戶圖形界面,但是卻不能理解它們。

語言是介面

在前面的部分,我將編程語言定義為人與計算機之間進行信息交換的媒介。按照這個定義,語言也就順理成章的可以被稱為介面。

這也是我對於語言本身的第二個定義:即面向語言的編程,從本質上講就是介面設計技術。如果您喜歡習慣介面技術,您也就會喜歡上LOP。如果你不習慣介面技術,你也還可能喜歡LOP,因為它可以幫您實現某些其他方法無法實現的介面。

談到語言本身是介面的時候,我最喜歡舉得例子是brag。它是一種用Racket定義的解析器生成語言。如果您曾經使用過類似lex或 yacc一類的工具,您就知道我們是想根據BNF語法生成一個解析器。舉個例子,一個bf語言的BNF語法可以是下面這樣:

bf-program : (bf-op | bf-loop)*
bf-op : ">" | "<" | "+" | "-" | "." | ","
bf-loop : "[" (bf-op | bf-loop)* "]"

有了brag,我們就不需要這樣繁瑣。在創建解析器的時候,我們只需像下面這樣將#lang brag語句添加到文件中,BNF語法就會被神奇地轉換為bra代碼:要使用通用語言創建解析器,我們必須將這個語法轉換為一系列本機代碼。

#lang brag
bf-program : (bf-op | bf-loop)*
bf-op : ">" | "<" | "+" | "-" | "." | ","
bf-loop : "[" (bf-op | bf-loop)* "]"

即使有解析器的生成器,這本身也是一項繁瑣卻沒有意義的工作。我們已經註明了語法,為什麼還要這樣做呢?

這是我最喜歡舉的一個LOP的例子,因為它比其它冗長的做法好很多。如果使用通用語言,這種介面基本上是不可能實現。就是這麼簡單!編譯之後,該文件將生成一個名為parse的函數,該函數就可以實現對應的BNF語法。

但是面向語言的程序員都會這樣做。

語言作為介面的優勢

這讓我想到了我的第三個也是最後一個關於語言的定義,即在所有的介面中,語言具有它獨特的優勢。您別嫌煩,我發現LOP在下面這些情況下很有優勢:

1. 當你想創建一個可供不太熟練的程序員、非程序員或懶惰的程序員們使用的介面的時候。多說一句,您千萬不要低估懶惰的程序員數量。

例如,Racket有一個精心設計的Web應用程序庫。但是您也可以使用web-server / insta快速啟動一個簡單的Web伺服器:

#lang web-server/insta
(define (start request)
(response/xexpr
"(html (body "Hello LOP World"))))

Matthew Flatt在他的文章「在Racket中創建語言」中演示了一種可生成可播放文本的語言。與brag一樣,它看起來更像是一個規範而不是一個程序,但是它確實能夠運行:

#lang txtadv
===VERBS===
north, n
"go north"
south, s
"go south"
get _, grab _, take _
"get"
===THINGS===
---cactus---
get
"Ouch!"
===PLACES===
---desert---
"You"re in a desert. There is nothing for miles around."
[cactus, key]
north
meadow
south
desert

2. 當你想更簡潔地表示的時候。正則表達式是一個例子。另外一個例子是我的DSLPollen,一種用於製作在線書籍的語言(包括這一本)。Pollen很像Racket。它們明顯的差別是對於Pollen,你需要以文本模式開始,並使用一個特殊字元來表示Racket命令,這些Racket命令被執行並且將執行結果添加到文本內容中。本段的第一部分就是這樣編寫的:

#lang pollen
When you want to simplify the notation. Regular expressions are one example.
My DSL ?link["https://pollenpub.com"]{Pollen} is a language for making online books.
desert

Pollen會插入必須的標籤並將這些內容轉換為正常的HTML。使用Pollen,我可以像手工編寫HTML那樣完全地控制頁面的內容,同時,又避免了手工操作可能帶來的錯誤,比如,不小心省略了結束標記。

簡化表示的另一個例子是lindenmayer,它是一種用於生成和繪製圖形的語言,稱為Lindenmayer系統,它可以繪製下面的圖像:

@程序員,為什麼選擇 Racket 語言?

如果使用普通的Racket,Lindenmayer程序是這樣寫的:

#lang racket/base
(require lindenmayer/simple/compile)
(define (finish val) (newline))
(define (A value) (display "A))
(define (B value) (display "B))
(lindenmayer-system
(void)
finish
3
(A)
(A -> A B)
(B -> A))

只需要更改文件頂部的#lang指令,您就可以將它進行簡化成:

#lang lindenmayer/simple
## axiom ##
A
## rules ##
A -> AB
B -> A
## variables ##
n=3

該語言假設您已經了解了Lindenmayer系統。這種簡化的表示方法可以很容易地實現您的要求。

3.當你想基於已有的表示法構建新的系統時。前面我們講到的brag,就是一個使用BNF語法作為源代碼的DSL。

#lang brag
bf-program : (bf-op | bf-loop)*
bf-op : ">" | "<" | "+" | "-" | "." | ","
bf-loop : "[" (bf-op | bf-loop)* "]"

還有另一個例子,如果嘗試過Pollen的人說「它確實很酷,但我還是更喜歡Markdown。」。這也能夠做到。pollen /markdown是Pollen的一個變種,它支持Pollen的語義,同時又能接受普通的Markdown符號:

#lang pollen/markdown
When you want to simplify the notation. Regular expressions are one example.
My DSL [Pollen]("https://pollenpub.com") is a language for making online books .

通過將Markdown解析器與現有代碼相結合,我只花了大約一個小時來創建這個變化的形式。你覺得快不快?

4. 當你想為其他語言創建中間格式的時候。JSON、YAML、S-expressions和XML都是定義數據格式的DSL。對於這些數據格式,對於機器來說,既可以是它們的輸入,也可以是他們的輸出。

在Beautiful Racket一文中,我提供了一種稱為jsonic的教學語言。它允許我們在JSON中嵌入Racket表達式,從而使我們也可以用JSON進行編程。比如:

#lang jsonic
// a line comment
[
@$ "null $@,
@$ (* 6 7) $@,
@$ (= 2 (+ 1 1)) $@,
@$ (list "array" "of" "strings") $@,
@$ (hash "key-1 "null
"key-2 (even? 3)
"key-3 (hash "subkey 21)) $@
]

它可以編譯出下面的JSON內容:

[
null,
42,
true,
["array","of","strings"],
{"key-1":null,"key-3":{"subkey":21},"key-2":false}
]

5. 當程序的大部分是配置信息的時候。例如,Dotfiles就可以被認為是DSL。另外一個更複雜的例子是由Jesse Alama開發的Riposte,它用於測試JSON格式的HTTP API:

#lang riposte
$productId := 41966
$qty := 5
$campaignId := 1
$payload := {
"product_id": $productId,
"campaign_id": $campaignId,
"qty": $qty
}
POST $payload cart/{uuid}/items responds with 200
$itemId := /items/0/cart_item_id
GET cart responds with 200

作為一種微型腳本語言,Riposte比普通的dotfile更智能。它隱藏了HTTP事務所需的所有中間代碼,並讓用戶專心編寫測試腳本。它可以使您專註於你關心的內容。

為什麼選擇Racket?

人們對於LOP的一個常見批評是「為什麼還要定義特定領域的語言?這難道不比開發特定的程序庫需要更多的工作嗎?「

如果你有合適的工具,那確實不會需要更多的工作。Racket就很不一樣:它的設計初衷就是為了支持LOP。因此,在Racket中實現DSL比其他方法更快、成本更低,同時也更容易。例如,在本書的第一篇教程中,我就向大家展示了即使您從未使用過Racket,您也可以在一小時內定義一門語言。

從本質上講,在Racket中每個DSL實際上都是一個源文件到源文件的編譯器。它將DSL的符號和語義轉換為對應的Racket程序。也正因為如此,Racket DSL的運行速度不會像用C語言編寫的程序那樣快。但它也使您可以在每個Racket DSL中訪問所有Racket的工具和庫。所以您在程序執行性能方面的損失,可以通過使用的便利來彌補。正是因為DSL方便使用,同時使用的成本又低,所以它們應用的範圍越來越廣。

總而言之,使用DSL不一定比開發特定的程序庫需要更多的工作。而且,正如我們已經看到的,作為一個介面,一種語言可以完成特定的程序庫無法完成的任務。

為什麼選擇宏?

由於Racket DSL會被編譯為Racket,使用Racket的程序員需要編寫一些語法轉換器,將DSL符號轉換為Racket。這些語法轉換器被稱為宏。實際上,宏可以被認為是Racket編譯器的擴展。

Racket的宏很龐大、優雅,也是Racket的精華。在本書中,我所重點講的都是Racket宏讓人覺得有趣的地方。比較突出的包括下面兩點:

  1. Racket有一個稱為語法對象的數據結構,它是宏之間進行交換的媒介。普通的字元串只能包含原始代碼,一個Racket語法對象可以保留它的層次結構,還可以包括像詞法上下文和源位置等的元數據和被稱為語法特性的任意欄位。這些元數據在各種轉換期間和代碼關聯。(詳細信息,請參閱語法對象。)
  2. Racket宏是健壯的,這意味著預設情況下,宏生成的代碼保留了定義宏的辭彙上下文。實際上,這減少了為使DSL正常所需的大量輔助性工作。(有關詳細信息,請參閱健壯。)

是否有可能在Python中實現DSL?當然可以。實際上,我就是用Python寫了我的第一個DSL,我現在仍然用這個DSL來實現我的類型設計工作。嘗試一次就夠了。從那時起,我就一直使用Racket。

結論:充分利用LOP

我猜到現在,您可能會想到:

  1. 「LOP似乎很有趣,但我不知道我會用它做什麼。」。當然,我也沒指望您馬上加入LOP的隊伍中。相反,我的目標是以有效的方式改變您你的思維。您現在已經了解了以前不熟悉的工具。今天,您可能想不到怎麼去應用它。但總有一天,你會遇到一個用現有語言所不能解決的問題。那時候,LOP就將派上用場。
  2. 「好吧,你已經說服了我,但我還是無法將LOP或者Racket在我的工作場所里使用。」。Jesse Alama在Jesse Alama』s story一文中,講述的他是怎樣讓他的同事們接受他的DSLRiposte。(摘錄如下,請注意我加粗的部分):

如果你想在用Racke做事之前得到許可,我覺得這不太可行。我認為你最好先做些事情,然後再解釋它們的好處,這樣會更容易。您可以與同事討論他們的工作並詢問他們:「我們如何模擬API的變化並確定我們做對了?「。對於這個問題的答案是:」寫一個Riposte腳本。「那時我很清楚我所製作的[DSL]會帶來真正的好處。我甚至沒有刻意地「推」Racket。我只是介紹DSL並向他們展示DSL可以怎麼幫助他們。

在我曾寫的「為什麼選擇Racket?為何選擇Lisp?」一文的結尾,我說Lisp語言「讓你有機會發現自己作為程序員和思想家的潛力,從而提高你對自己能夠取得的成就的期望。」

LOP提供了類似的機會:它可以提高我們對編程語言能夠做什麼的期望。語言不是黑盒子。它們是我們可以設計的介面。這樣,我們用程序可以做更多的事情。

如果你能找到更好的編程技術,建議你使用。現在我有了LOP&Racket,就不會再回到過去。

更多閱讀資料

  • 我和Matthew Butterick編寫的Beautiful Racket(https://beautifulracket.com/)。你當前正在看的在線圖書。但是你現在是在本書的附錄部分。本書的主要部分是一系列漸進式LOP教程,全部依賴於Racket及其出色的宏系統。
  • Racket學 School 2019(https://school.racket-lang.org/)。今年夏天,Racket學校提供了兩個LOP課程:由我教授的為期三天的美麗的Racket工作室和為期五天、由Racket設計師執教的如何設計語言。
  • 由Jesse Alama 編寫的Language Oriented Programming in Racket: A Cultural Anthropology(https://gumroad.com/l/lop-in-racket-cultural-anthro)。這是一個很吸引人的標題,裡面是Jesse與眾多Racket愛好者(包括我在內)進行的一系列訪談,其中包含了對如何將LOP融入我們的工作的截然不同的觀點。
  • Matthew Flatt所編寫的Creating Languages in Racket。(http://queue.acm.org/detail.cfm?id=2068896)Matthew Flatt是Racket的首席架構師(並且寫了這本書的前言)。這篇簡短的文章通過創建遊戲的DSL來向大家展示了怎麼樣不斷提高DSL設計水平。
  • 實現的Racket 的例子:More examples(https://beautifulracket.com/appendix/domain-specific-languages.html#racket-implemented-dsls)和even more(http://docs.racket-lang.org/search/index.html?q=H%3A)。

原文:https://beautifulracket.com/appendix/why-lop-why-racket.html

本文為 CSDN 翻譯,轉載請註明來源出處。

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 CSDN 的精彩文章:

優秀的程序員是如何誕生的?
當過愛因斯坦助理參加過曼哈頓計劃,還發明了受歡迎的編程語言

TAG:CSDN |