@程式設計師,為什麼選擇 Racket 語言?
Racket 作為眾多 Lisp 方言中的一種,是一種可程式設計的計算機程式設計語言 ,同時也是一個程式設計環境。其也曾一度被列入教科書的素材,但是對於這門小眾化語言,是否有必要上手?
作者 | beautiful 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真的有這麼強大,那麼您也就不需要花幾天時間來學習我這本教程,我也應該能夠很輕鬆地講解它。我應該能夠回答下面的兩個簡單的問題:
-
哪些問題最適合用面向語言的程式設計解決?
-
為什麼Racket最適合完成開發語言的任務?
第二個問題很容易回答。但是,第一個問題就不太容易回答。很多人也多次問我第一個問題。我經常用Potter Stewart法官說的那句名言來回答:你看到它的時候,你就會知道。這個回答對那些LOP的好奇者來說已經足夠了。但是,對那些仍然想要更多實際理由的觀望者們,卻不會讓他們滿意。
所以,我將進行一次更有意義的嘗試。請記住,我不是計算機科學系的教授。我不會像他們那樣講解程式語言。相反,我將Racket和DSL用在我的實際工作中。我的目地是以對其他實際使用者有參考價值的方式來闡述問題。(如果我沒有講清楚,請您點選左邊併發送評論。)
簡短的回答
-
面向語言程式設計實際上是一種介面設計技術。它非常適合於那些需要最少的概念,同時又保持最高的精度的任務。最少的概念=所有的概念都是您允許的,沒有可有可無的概念。最高精度=該概念的含義正是您要表達的意思。沒有固定的模板。除了LOP,其他的技術都做不到。(您如果著急的化,可以直接閱讀適合用LOP完成的這些任務。)
-
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,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巨集讓人覺得有趣的地方。比較突出的包括下面兩點:
-
Racket有一個稱為語法物件的資料結構,它是巨集之間進行交換的媒介。普通的字串只能包含原始程式碼,一個Racket語法物件可以保留它的層次結構,還可以包括像詞法上下文和源位置等的元資料和被稱為語法特性的任意欄位。這些元資料在各種轉換期間和程式碼關聯。(詳細資訊,請參閱語法物件。)
-
Racket巨集是健壯的,這意味著預設情況下,巨集生成的程式碼保留了定義巨集的詞彙上下文。實際上,這減少了為使DSL正常所需的大量輔助性工作。(有關詳細資訊,請參閱健壯。)
是否有可能在Python中實現DSL?當然可以。實際上,我就是用Python寫了我的第一個DSL,我現在仍然用這個DSL來實現我的型別設計工作。嘗試一次就夠了。從那時起,我就一直使用Racket。
結論:充分利用LOP
我猜到現在,您可能會想到:
-
“LOP似乎很有趣,但我不知道我會用它做什麼。”。當然,我也沒指望您馬上加入LOP的隊伍中。相反,我的目標是以有效的方式改變您你的思維。您現在已經瞭解了以前不熟悉的工具。今天,您可能想不到怎麼去應用它。但總有一天,你會遇到一個用現有語言所不能解決的問題。那時候,LOP就將派上用場。
-
“好吧,你已經說服了我,但我還是無法將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 翻譯,轉載請註明來源出處。
【END】
作為碼一代,想教碼二代卻無從下手:
聽說少兒程式設計很火,可它有哪些好處呢?
孩子多大開始學習比較好呢?又該如何學習呢?
最新的程式設計教育政策又有哪些呢?
下面給大家介紹CSDN新成員: 極客寶寶(ID: geek_baby)
戳他了解更多↓↓↓
熱 文推 薦
☞她高中發明著名演算法,保送清華姚班,斯坦福 AI 實驗室負責人高徒 | 人物誌
☞從Pixel 3a到Android Q,一份谷歌AI能力的“成績單” | Google I/O全程回顧
☞20年無人能破的RSA演算法發明人出的密碼學難題, 竟被這個無名程式設計師3年破解!
點選閱讀原文,輸入關鍵詞,即可搜尋您想要的 CSDN 文章。
你點的每個“在看”,我都認真當成了喜歡