從Scheme歸來的感受

關於Scheme的個人感受。

2020。1。18

學Scheme大概半年了,在此之前我只學過BASH,一點點awk,可稱是真正的從零入門。現在我已 經充分體驗過它的有趣與恐怖之處了,因此也來說幾句公道話。

個人經歷

——————————————————

首先呢,我看了兩本圈子裡比較著名的譯本,那本『N天學會Scheme』太古板了,而且很不好懂(到現在……後面幾章還是看不懂),另一本書挺簡 明的,可惜例子少了點(後面幾章也不懂XD)。

很慚愧,那段時間看的Scheme書,包括The Little Schemer,都被我生吞活剝了。

真正意識到自己鍵入的表示式幹了什麼,是看了include-yy@github譯的那份Scheme簡明介紹,guenchi啟動了這個翻譯計劃,看完之後我大致懂了Scheme的List是個什麼東西,以及Scheme中的Object是一種叫指標的東西(悔了,怎麼不先學C)。

後來受liyanri@github(網名雞膚,一位文風沉 穩幽默的C程式設計師,兼修Scheme與範疇論)影響,去讀了guile man手冊,直到現在。

感受

——————————————————

Scheme(的各種擴充套件版方言)已然是是成熟的工業語言(但是Scheme不發糖!好在我們偉大的主祭cthulhu已經發過了)。對於使用過Python,Ruby,Js的人,Scheme有一種粗獷而奇特的風味(沒語法,多括號)。使用Python時感覺像坐在燒烤攤上 ,各種串應有盡有,酒水盡著你喝(合不合口味 就難說)。使用Scheme好像坐在河灘邊的石塊上 ,面前只一個石頭灶,有嘛是嘛,沒鹽也行。夕陽漸下,萬籟俱寂,入夜了,回家吧,早些休息。

我遇到的問題

————————————————-

但是說實在的,Scheme社群的書(我說的是tspl 那種書!)往往不太樂意講如何將Scheme用於實踐、工程中,就是說,沒有太多關於防守性程式設計和特定領域知識的內容。像「Scheme web開發最佳實踐」這種書,不存在的。(反過來,C++,Java,Python,js……即使Ruby也比Scheme人緣好啊-_-) 另外,也沒人提提效能最佳化這事兒,艹。

見鬼!問題就在這兒了,那些書把Scheme簡直是當成一種純思辨性質的遊戲在傳授(我也真是把Scheme當遊戲在玩,大學就改),Continuation,Macro,指稱語義(Lisp in smallpiece),Lambda演算這些東西不要錢地往讀者面前擺,好像Scheme根本不是一種工業語言似的(但是……我又說但是了,那些書的作者往往精於實踐)。

連Haskell都有Real world haskell啊。

另一個問題,Scheme社群鼓勵大夥多寫純函式,將大量純函式和少量副作用組合成最終的可用程式。好倒是挺好,可惜讓Scheme背了多年黑鍋。現在Scheme幾乎與函數語言程式設計掛上鉤了,CommonLisp做為Lisp家族兩大支柱的另一員也遭受了池魚之殃。仔細一看,Scheme只是比較早的一種混合正規化語言,Commonlisp只是一種主打面向物件的指令式語言。發暴論了:正是這些都市傳說導致了這麼多年來Lisp系語言使用者稀少。(但是那 個改名叫Ecmascript/Javascript的Scheme方言 卻大獲成功,真叫人頭大。)

又不是沒有副作用!要用就用嘛!

搞得現在Haskell崛起了。

爭論

——————————————————

宏到底好不好?這可能是社群中分歧最大的爭論 了。

特別之處

————————————————-

一種語言背後隱含的方法論、它所關聯的特定領域的知識才是真正的特別之處。Scheme作為一種語言從來都不難,但是Scheme社群特別喜歡把Scheme作為討論編譯原理,Lambda演算,函數語言程式設計,指稱語義,超程式設計,邏輯式程式設計的工具(但是……我不會,好在不會也可以玩得很開心,社群裡的朋友也不會見怪。),這些奇特的知識領域有 一部分可能確實學習者寥寥無幾……或者大夥入門的工具箱不太一樣。學好C,吃飽飯嘛。

結論

————————————

Scheme並不高於其他語言,但是它確實博得了一 小批人的偏愛,沒啥關係,學不學Scheme仍然是一個無標準答案的問題。

但也別搞得好像它是什麼古怪宗教的抄本一樣,想學總不會缺資料的

——————————————————————-

2020 12。18 補

當初想用guile寫個web程式,翻翻找找,除了Artanis和自帶的http server基本就無了。Artanis作者跑去搞嵌入式scheme實現,直接送給FSF了,自帶的http server……當然高階函式和Sxml是好的,可惜我不太會用。

在guenchi的論壇看到他們在為string-split做 最佳化,最後的結果放到一個基礎庫裡了,這當然很好,可是庫是給chez用的,我只有爪機,用著pthread偶爾抽風的guile2。2。4。(libgc在Android平臺上有點水土不服……)

寫了個掃雷,因為邊界條件很多,想寫的清晰一些,guile可以透過reader 宏支援中綴,但是很奇怪,在我把一些中綴表示式巢狀進let之後展 開的程式碼開始混雜凌亂,完全不得其法,又沒能力改動,現在更新2。2。6,希望問題已經解決了 。

後來有人和我說如果我不會自己改實現,就不要將scheme當成工業語言,我想了想,去看racket去了,不過racket的生態紅利我還是沒吃到,raco安裝一個包總是停不下來,應該是我太矮了。

至於幾乎每個schemer都會的編譯原理,現在還 是不會, 大概以後也未必會。

哈哈,還是爛人一個。我沒有變,scheme也沒有變,時代變了。

順便,為什麼我對C有點難以言喻的複雜感情

從Scheme歸來的感受

太草了。

{-# UPDATE 2020。2。10 #-}

試用haskell實現microkanren,發現不用Monad沒法寫,再看看scheme,一點賦值沒用,就40行……