[PLT] 柯里化的前生今世(三):語言和同像性

按照故事情節(jié)的正常發(fā)展揖赴,我們這一篇該介紹Racket語言的語法了。
可是抑胎,在大局觀上燥滑,我們還沒有達成共識。
對于一個概念來說阿逃,我們不止要學會怎樣描述它铭拧,還要學會理解它的內(nèi)涵。
因此恃锉,這篇還是在打基礎搀菩,俗稱,引言破托。肪跋。

關于

本文是系列文章中的第三篇,
上一篇中土砂,我們提到了Lisp語言家族州既,看到了關于Lisp最美麗的傳說,我們提到了Racket萝映,以及它的IDE吴叶,DrRacket。

本文將從目標語言和元語言序臂,同像性晤郑,引用等這些角度來深入的討論Lisp,
淺嘗輒止贸宏,畢竟不是一個好習慣造寝。

目標語言和元語言

當我們討論一件事物時,我們所使用的語言被稱為對象語言吭练。
而當我們談論一種語言時诫龙,我們所使用的語言被稱為元語言。

在任何語言研究中鲫咽,都有一種作為研究對象的語言签赃,還有一種由研究者用來談論對象語言的元語言谷异。
對象語言與元語言是相對而言的。
任何語言锦聊,無論它多么簡單或者多么復雜歹嘹,當它作為被談論的對象的時候,它就是對象語言孔庭;
當它用來討論一種語言的時候尺上,它就是元語言。

區(qū)分開目標語言和元語言圆到,是學好Lisp的第一步怎抛,也是理解Lisp元編程的第一步。

形式語言

日常生活中芽淡,我們有了這樣的認識马绝。
我們所了解的漢字總是有限的,但是我們能說的話挣菲,卻是無限的富稻。
可以說出任意長度的漢字序列。

程序語言也是如此白胀。
有人說編程唉窃,不就是輸入A到Z嗎,指的就是這個編程語言的“字母表”纹笼。
字母表所包含的字母,是有限的苟跪,但是可以寫出無限多個“句子”廷痘。

“語言”,正是這些“句子”的集合件已。
所謂形式語言笋额,指的是用精確的數(shù)學,或機器可處理的公式篷扩,定義的語言兄猩。
相應的數(shù)學和計算機科學分支叫做形式語言與自動機理論,
它只研究語言的語法而不討論它的語義鉴未。

當初枢冤,為了研究語言的性質,人們從兩個角度出發(fā)铜秆,
一個是從語言的識別角度來看淹真,提出了自動機理論。
另一個是從語言的生成角度來看连茧,有喬姆斯基開創(chuàng)的形式語言理論核蘸。
這兩個理論之間巍糯,又是互相關聯(lián)的。

文法

文法提供了一種方便的方法來定義“句子”的無限集客扎。

為了描述語言的結構祟峦,John Backus和Peter Naur創(chuàng)造了一種語言的描述方法,
稱為BNF(Backus-Naur Form)徙鱼。

expr ::= term { "+" term | "-" term }.
term ::= factor { "*" factor | "/" factor }.
factor ::= "(" expr ")" | const.
const := "1" | "2" | "3".

BNF表示中的每一行宅楞,稱為一個“產(chǎn)生式”,::=表示左邊的項可以由右邊的項來產(chǎn)生疆偿。
其中咱筛,用引號括起來的項,稱為“終結符”杆故,相當于字面量迅箩。
不用引號括起來的項,稱為“非終結符”处铛,它們可以由其他項組成饲趋。

{…}是約定好了的符號,用來表示它包含的項可以出現(xiàn)0次或更多次撤蟆。
常用的還有[…]奕塑,用來表示,可以出現(xiàn)也可以不出現(xiàn)家肯。

以上BNF描述了算術表達式的語法龄砰。
例如:1*(2+3),可以從expr開始生成出來讨衣,

expr
=> term
=> factor "*" factor
=> const "*" "(" expr ")"
=> const "*" "(" term "+" term ")"
=> const "*" "(" factor "+" factor ")"
=> const "*" "(" const "+" const ")"
=> "1" "*" "(" "2" "+" "3" ")"

expr稱為“開始符號”换棚。

綜上,一個語言的所有終結符反镇,非終結符固蚤,產(chǎn)生式,開始符號歹茶,
構成了這個語言的文法夕玩。

語言的分類

喬姆斯基,根據(jù)語言文法產(chǎn)生式的特點惊豺,把語言分為了4類燎孟。
不同的文法,能描述不能范圍的語言集合尸昧,雖然它們都是無限集缤弦。

0型文法,能力最強彻磁,可以產(chǎn)生遞歸可枚舉語言碍沐。
1型文法狸捅,能力稍弱,可以產(chǎn)生上下文有關語言累提。
2型文法尘喝,能力次之,可以產(chǎn)生上下文無關語言斋陪。
3型文法朽褪,能力最弱,可以產(chǎn)生正則語言无虚。

這些文法缔赠,建立了一個從大到小,互相包含的友题,語言集合的層次關系嗤堰。
例如:正則語言,一定是上下文無關語言度宦,反之踢匣,則不成立。
其中戈抄,2型和3型文法用的最多离唬,有特殊的名字,稱為划鸽,上下文無關文法输莺,正則文法。

我們似乎發(fā)現(xiàn)了裸诽,這里也出現(xiàn)了“正則”兩個字嫂用,難道與正則表達式有關?
確實崭捍,正則表達式,是正則文法的便利寫法啰脚。
正則表達式所描述的語言殷蛇,就是正則語言。

S表達式

了解過Racket之后橄浓,我們發(fā)現(xiàn)Racket程序都用一種稱為S表達式的語法寫成粒梦。
S表達式,是Lisp語言的特色荸实,它是二叉樹的一種線性編碼匀们。

我們知道二叉樹是很重要的數(shù)據(jù)結構,可以用來存儲結構化的數(shù)據(jù)准给。例如:

     *
   /   \
  *     *
 / \   / \
a   b c   d

二叉樹的每個節(jié)點泄朴,或者是葉節(jié)點重抖,或者有2個子節(jié)點,葉節(jié)點可以用來存儲數(shù)據(jù)祖灰。
可是钟沛,這樣表示二叉樹,太麻煩了局扶,不容易書寫恨统。
于是,先哲們發(fā)明了“點對表示法”三妈,((a . b) . (c . d))可以表示上面的二叉樹畜埋,
其中“.”表示節(jié)點。

S表達式是點對表示法的形式定義:

Atom ::= Num | Symbol
S-exp ::= Atom | "(" S-exp "." S-exp ")"

所以畴蒲,S表達式或者是原子(Atom)悠鞍,或者是遞歸的由其他S表達式構成的點對。

實際使用時饿凛,書寫S表達式狞玛,還要同時寫很多點號“.”,這也是一件麻煩的事情涧窒。
因此心肪,Lisp語言定義了一套S表達式的化簡規(guī)則。
(1)如果一個點號右鄰一個左括號纠吴,那么就可以將這個點號硬鞍,左括號以及匹配的右括號,一起去掉戴已。
例如:(a . (b . c)) <=> (a b . c)

(2)如果一個點號右鄰原子nil固该,那么就可以把這個點號和原子nil,一起去掉糖儡。
例如:(a . (b . nil)) <=> (a b . nil) <=> (a b)

同像性

同像性伐坏,指的是程序和程序所操作的數(shù)據(jù)采用了統(tǒng)一編碼。

Lisp語言使用了S表達式握联,例如桦沉,(fn x)
既可以看做是程序金闽,用參數(shù)x調(diào)用函數(shù)fn纯露,
也可以看做是數(shù)據(jù),由符號fn和符號x構成的列表代芜。

同像性使得我們埠褪,可以像處理數(shù)據(jù)一樣處理代碼。
做一些代碼轉換之類的工作,十分簡單钞速。

例如贷掖,
當遇到(fn x)時,
我們可以讓它先轉換成玉工,

(begin
    (display x)
    (gn x))

然后再執(zhí)行羽资。

甚至也可以用來定義變量,

(define-with-display (f a)
    (g a))

轉換成遵班,

(define (f a)
    (display a)
    (g a))

這種代碼層面的轉換稱為“宏”(macro)屠升。

引用

在Lisp語言中,引用(quotation)是一個很獨特的概念狭郑。
這與按引用傳參(call by reference)完全是兩碼事腹暖。

在Lisp程序中,我們知道(+ 1 2)是一個加法調(diào)用翰萨,
但是它也可以表示由3個符號+脏答,12構成的列表。
列表是數(shù)據(jù)亩鬼,加法調(diào)用是程序殖告,它們雖然采用了相同的編碼,可是我們沒有辦法區(qū)分雳锋。

首先想到的就是讓它們采用不同的編碼黄绩。例如:
我們把函數(shù)調(diào)用編碼為+[1;2],而列表編碼為(+ 1 2)
人們一開始也是這么做的玷过,+[1;2]稱為M表達式爽丹,(+ 1 2)稱為S表達式。

可是辛蚊,后來人們發(fā)現(xiàn)粤蝎,如果用Lisp語言來處理Lisp程序文本時,
不同的編碼袋马,會增加難度初澎,即,失去了同像性的種種優(yōu)勢虑凛。

另一方面碑宴,程序主要是由函數(shù)調(diào)用組成的,把程序看成數(shù)據(jù)是更少見的一種場景卧檐。
所以墓懂,人們進行了以下編碼焰宣,
函數(shù)調(diào)用編碼為(+ 1 2)
而列表編碼為(quote (+ 1 2))

即霉囚,(+ 1 2)求值,會導致函數(shù)調(diào)用匕积。
(quote (+ 1 2))求值盈罐,會得到一個列表榜跌。
于是,我們就統(tǒng)一的用S表達式盅粪,完成了對程序和數(shù)據(jù)的相同編碼钓葫。

后文所需要的基礎

下一篇文章,我們要回到高階函數(shù)上來了票顾,我們要寫一個簡易的解釋器础浮,
實現(xiàn)詞法作用域,然后自然的得到閉包這種數(shù)據(jù)結構奠骄。
所以豆同,Racket語法方面,大家還是抽空多了解下吧含鳞。

參考

元語言
形式語言
S表達式
同像性
程序設計語言:實踐之路
LISP語言

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末影锈,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蝉绷,更是在濱河造成了極大的恐慌鸭廷,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件熔吗,死亡現(xiàn)場離奇詭異辆床,居然都是意外死亡,警方通過查閱死者的電腦和手機磁滚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門佛吓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人垂攘,你說我怎么就攤上這事维雇。” “怎么了晒他?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵吱型,是天一觀的道長。 經(jīng)常有香客問我陨仅,道長津滞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任灼伤,我火速辦了婚禮触徐,結果婚禮上,老公的妹妹穿的比我還像新娘狐赡。我一直安慰自己撞鹉,他們只是感情好,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鸟雏,像睡著了一般享郊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上孝鹊,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天炊琉,我揣著相機與錄音,去河邊找鬼又活。 笑死苔咪,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的柳骄。 我是一名探鬼主播悼泌,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼夹界!你這毒婦竟也來了馆里?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤可柿,失蹤者是張志新(化名)和其女友劉穎鸠踪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體复斥,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡营密,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了目锭。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片评汰。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痢虹,靈堂內(nèi)的尸體忽然破棺而出被去,到底是詐尸還是另有隱情,我是刑警寧澤奖唯,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布惨缆,位于F島的核電站,受9級特大地震影響丰捷,放射性物質發(fā)生泄漏坯墨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一病往、第九天 我趴在偏房一處隱蔽的房頂上張望捣染。 院中可真熱鬧,春花似錦停巷、人聲如沸耍攘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽少漆。三九已至,卻和暖如春硼被,著一層夾襖步出監(jiān)牢的瞬間示损,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工嚷硫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留检访,地道東北人。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓仔掸,卻偏偏與公主長得像脆贵,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子起暮,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構建分布式系統(tǒng)中一些常見模式的工具(例如配置管理卖氨,服務發(fā)現(xiàn),斷路器负懦,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Lisp的本質 - climbdream的個人空間 - 開源中國社區(qū)https://my.oschina.net/...
    葡萄喃喃囈語閱讀 686評論 0 10
  • 香溪如夢纸厉,似故園系吭;香溪入夢,頗思故園…… (一) 初識香溪颗品,是十余年之前肯尺,頂著盛寵的名號,把小城滋養(yǎng)的柔美躯枢、瀲滟则吟,...
    青梅驛閱讀 481評論 0 6
  • 我迷戀過去 幻想昨日重現(xiàn) 可每次遍體鱗傷失望至極 碰壁的懊惱如金魚般七秒鐘忘記 我要離開 去往盛開蔚藍花的地方 那...
    溚拍者閱讀 189評論 1 4
  • 《挖掘歷史文化逾滥,彰顯時代內(nèi)涵》 夾皮溝土匪文化1: 歷史上以狩獵為主,1897年8月败匹,沙俄與滿清政府簽定協(xié)議寨昙,在...
    四號棚閱讀 447評論 0 0