他們發明了一門編程語言,名字叫:搖滾明星 Rockstar
譯者 | 薛命燈
Rockstar 是一門圖靈完備的動態編程語言。設計這門語言的目的是能夠像寫歌詞一樣開發計算機程序。它的歌詞風格主要受 20 世紀 80 年代重搖滾和電力民謠的影響。
為什麼會有 Rockstar?
如果我們讓 Rockstar 成為一門真正的(雖然毫無意義)編程語言,招聘人員就不會在招聘時對「搖滾開發者」頗有微詞。
另外,它很有趣,一門基於歌詞編譯的編程語言很值得我們一試。
我們還可以用它做貼紙,誰不想在自己的筆記本電腦上貼上「認證 Rockstar 開發者」這樣的貼紙呢?
Rockstar 語言規範
注釋
我們不建議在 Rockstar 程序中使用注釋。這可是 Rockstar,所以要讓閱讀代碼的人自己從中尋找意義。但如果你堅持要使用注釋,那麼請把注釋放在括弧里。是的,這意味著你不能在算術表達式中使用括弧,如果有複雜的表達式,要將它們分解為多個子句。
Tommy was a lean mean wrecking machine. (initialises Tommy with the value 14487)
變數
在 Rockstar 中,有兩種聲明和使用變數的方式。
公共變數由一個關鍵字(a、an、the、my 或 your)和關鍵字後面的變數名組成,變數名只能包含小寫 ASCII 字母 a-z。
特定變數由專有名片語成,專有名詞是指任何不是保留關鍵字並以大寫字母開頭的單詞。特定變數名稱可以包含空格,只要每個空格後跟一個大寫字母。可能有一些開發人員會創建類似 Customer ID、Tax Rate 或 Distance In KM 這樣的變數名稱,不過我們建議你使用慣用的變數名稱,如 Tommy、Gina、Doctor Feelgood、Mister Crowley、Kayleigh、Tom Sawyer、Billie Jean 和 Janie。
Eleanor Rigby、Peggy Sue、Black Betty、Layla 和 Johnny B Goode 在 Rockstar 中也都是有效的變數名,儘管嚴格來說它們算不上是慣用的。
與 Ruby、Python 和 VBScript 一樣,Rockstar 的變數是動態類型的,所以不需要在使用前進行聲明。
代詞
關鍵詞 it、he、she、him、her、them、they 總是指向最近命名的變數。
類型
Rockstar 使用了與 ECMAScript 非常相似的類型系統,不過 undefined 聽起來不是非常搖滾,所以我們使用 mysterious 替代它。
Mysterious——任何未賦值的變數,使用關鍵字 mysterious 表示。
Null——空值類型,在計算時等於 0 或 false。關鍵字 nothing、nowhere 和 nobody 是 null 的別名。
Boolean——具有 true 和 false 值的邏輯實體。(關鍵字 maybe 和 definitely maybe 被保留下來,可能在未來會用到)。
right、yes 和 ok 是 true 的有效別名。
wrong、no 和 lies 是 false 的有效別名。
Number——Rockstar 中的數字使用 DEC64 數字類型進行存儲。
String——Rockstar 中的字元串是 16 位無符號整數值的序列。
Object——數據屬性的集合,與 ECMAScript 一樣。
字面量和賦值
Rockstar 中的字元串字面量使用雙引號括起來。
「Hello World」
Rockstar 中的單引號被視為普通的字母。這似乎有點不尋常,直到你想起來 ain"t talkin』 "bout love 在搖滾中其實是一句完美有效的歌詞。
Rockstar 中的數字字面量是十進位數字。
賦值使用 put/into 關鍵字組合:
Put 123 into X 表示將 123 賦值給變數 X。
Put 「Hello World」 into the message 表示將「Hello World」賦值給 the message 變數。
遞增和遞減
我們分別使用 Build up 和 Knock down 關鍵字進行遞增和遞減。
Build my world up 將會讓 my world 的值增加 1。
Knock the walls down 將會讓 the walls 的值減 1
算術
基本的算術運算使用 plus、minus、times、over 和 by 關鍵字。
算術表達式:
plus ——加法,別名為 with。
minus ——減法,別名為 without。
times ——乘法,別名為 of。
over ——除法,別名為 by。
例子:
Put the whole of your heart into my hands——把 your heart 和 the whole 相乘,並把結果賦值給 my hands。
My world is nothing without your love——將零減去 your love,並將結果賦值給 my world。
If the tears of a child is nothing——檢查 the tears 乘以 a child 是否等於零。
My love by your eyes——返回 my love 除以 your eyes 的值。
詩意字面量
Rockstar 還支持一種獨特的語言特性,稱為詩意字面量(poetic literal)。受 here-document 語法的啟發,詩意字面量允許程序員在初始化變數的同時表達他們內心深處的焦灼。
詩意類型字面量
在使用關鍵字 true、false、nothing、nobody 和 nothing 進行賦值時,使用單行代碼,包括變數名、is 關鍵字和字面量。
My heart is true——使用布爾值 true 來初始化 my heart。
Tommy is nobody——使用 nobody 別名將 Tommy 的值初始化為 null。
詩意字元串字面量
在進行詩意字元串字面量賦值時,以變數名作為開頭,後面跟一個關鍵字(如 says),然後再跟上一個空格。剩餘部分(直到碰到
終止符)被視為不帶引號的字元串字面量。
Billy says hello world!
表示使用字元串字面量 hello world! 來初始化 Billy。
The world says hello back
表示使用字元串字面量 hello back 來初始化 the world。
詩意數字字面量
在進行詩意數字字面量賦值時,以變數名作為開頭,後面跟上關鍵字 is,或者別名 was 或 were。只要下一個符號不是保留關鍵字,這一行的其餘部分將被視為一個十進位數,這個數由連續出現的字元串長度對應的數字組成。為了表示數字零,也為了彌補搖滾中缺少單字母單詞和雙字母單詞,單詞長度需要對 10 取模。句點(.)表示小數位。除第一個句點外,任何非字母字元都將被忽略。
Tommy was a lovestruck ladykiller 表示使用 100 來初始化 Tommy。
Sweet Lucy was a dancer 表示使用 16 初始化 Sweet Lucy。
A killer is on the loose 表示使用 235 初始化 a killer。
My dreams were ice. A life unfulfilled; wakin" everybody up, taking booze and pills 表示使用 3.1415926535 初始化 my dreams。
請注意,詩意字面量可以包含保留關鍵字,比如這個例子中的 taking。
比較操作
與 Visual Basic 和一些腳本語言中的單個等號運算符類似,Rockstar 中的 is 關鍵字出現在語句中還是出現在表達式中所表示的意思也不一樣。
Rockstar 中的比較操作只能在表達式中完成。
Tommy is nobody 使用 nobody 來初始化 Tommy。
If Tommy is nobody 表示在 Tommy 等於 nobody 時執行後面的代碼塊。
修飾符 not 會反轉比較操作的結果,類似於 SQL 中的 IS NULL / IS NOT NULL。關鍵字 ain』t 是 is not 的別名。這種用法與慣用英語相反,其中「Tommy isn』t anybody」、「Tommy ain』t nobody」和「Tommy ain』t not nobody」表示相同的意思。
Rockstar 還支持以下的比較語法:
is higher/greater/bigger/stronger than 表示「大於」。
is lower/less/smaller/weaker than 表示「小於」。
is as high/great/big/strong as 表示「大於等於」。
is as low/little/small/weak as 表示」小於等於「。
輸入輸出
在 Rockstar 中,我們使用 Listen 關鍵字從 STDIN 讀取一行輸入,並使用 Listen to 將輸入賦值給變數。
Listen to your heart——從 STDIN 讀取一行,並將它賦值給 your heart。
使用 Say 關鍵字將變數的值寫到 SDTOUT。
Say Tommy——將 Tommy 的值輸出到 STDOUT。
Rockstar 將 Shout、Whisper 和 Scream 作為 Say 的別名。
流程式控制制和塊語法
條件語句
條件表達式以 If 關鍵字作為開頭,後面跟上表達式。如果表達式的計算結果為 true,則執行後續的代碼塊。在 If 代碼塊之後可以有可選的 Else 代碼塊。如果 If 表達式計算結果為 false,則執行 Else 關鍵字後面的代碼塊。
循環
與 If 語句類似,循環使用 While 或 Until 關鍵字表示,只要表達式得到滿足,後面的代碼塊會被重複執行:
使用 16 初始化 Tommy,然後循環,每次將 Tommy 減 1,直到 Tommy 等於零。
break 和 continue 語句的用法與其他大多數基於代碼塊的語言一樣。Rockstar 將 Break it down 定義為 break 的別名,並將 Take it to the top 定義為 continue 的別名。
代碼塊
Rockstar 中的代碼塊以 If、Else、While 或 Until 作為開頭,並以空行或 EOF 作為結尾。
函數
函數使用變數名和後面的 take 關鍵字以及由 and 關鍵字分隔的參數列表進行聲明。
Multiply takes X and Y
Search takes Needle and Haystack
函數體是一個沒有空行的語句列表。空行表示函數體的結束。Rockstar 中的函數總是有返回值,使用 Give back 關鍵字表示。
使用 taking 關鍵字調用函數:
Multiply taking 3, 5 相當於 returning (presumably) 15
Search taking "hands", "lay your hands on me"
示 例
使用極簡的 Rockstar 表達 FizzBuzz,為了清晰起見,使用了縮進:
慣用的 Rockstar,使用詩意字面量,沒有縮進:
一些想法
如果有可能,嘗試改進這門語言。我並不熱衷於連續塊語法——對於初學者來說,還無法實現嵌套塊。
想辦法實現圖靈完備的搖滾民謠編譯器。或許是基於 BF 的東西,我們使用單詞長度或首字母或其他東西將歌詞編譯成 BF,或者其他一些極簡但圖靈完整的語言。
製作」認證 Rockstar 開發者「貼紙,並將它們發給任何可以寫 Rockstar 代碼的人。
使用 composer 為代碼生成樂譜。
相關實現
rockstar-js——Rockstar-to-JavaScript 編譯器
https://github.com/wolfgang42/rockstar-js
rockstar-lexer——使用 Haskell 編寫的 Rockstar 詞法分析器
https://github.com/aitorres/rockstar-lexer
rockstar-java——Rockstar 的 Java 解釋器
https://github.com/nbrevu/rockstar-java
rockstar-py——Rockstar-to-Python 編譯器
https://github.com/yanorestes/rockstar-py
英文原文
https://github.com/dylanbeattie/rockstar
今日薦文
※那些重金投入區塊鏈的互聯網巨頭,現在怎樣了?
※都是前端工程師,為什麼他的年薪過百萬?
TAG:InfoQ |