以下內(nèi)容只是我的學(xué)習(xí)記錄筆記
很早之前看過《黑客與畫家》顷霹,對(duì)lisp心生向往翘盖,之后認(rèn)識(shí)的大神推薦《計(jì)算機(jī)程序的構(gòu)造與解釋》朦蕴,之前一段時(shí)間看了一點(diǎn),然后又中斷了侣夷。決定開始好好學(xué)習(xí)横朋,重新拿起那本已經(jīng)泛灰的老書。
首先你可能會(huì)問為什么要學(xué)lisp這一門古老的編程語言百拓?作為一名小白琴锭,顯然是沒辦法回答你這個(gè)問題的…看看王垠大神怎么說的吧,Lisp 已死衙传,Lisp 萬歲决帖!
首先你得配置下scheme相關(guān)的環(huán)境對(duì)吧,然后當(dāng)然我又扔給你一個(gè)鏈接蓖捶,還是王垠大神的地回,希望以后自己能夠早日修煉成神,不用到處扔別的大神的鏈接俊鱼,Scheme 編程環(huán)境的設(shè)置刻像。
如果你用的mac或者linux,應(yīng)該很快就把環(huán)境給配置好啦并闲,然后接下來的問題就是细睡,臥槽,emacs是什么東西帝火,作為一名程序員溜徙,你當(dāng)然聽過,(沒聽過的也假裝聽過犀填,反正現(xiàn)在聽過了)蠢壹,但是,問題來了九巡,你并不會(huì)用图贸,我也不會(huì),作為一個(gè)習(xí)慣各種ide編輯器或者vim黨的程序員,不會(huì)用emacs還是很正常的…默默的在心里默念求妹,自己怎么這么渣乏盐。
那就好好學(xué)吧佳窑,網(wǎng)上找找教程制恍,先學(xué)學(xué)基本的吧,比如說 Emacs入門系列:3分鐘學(xué)會(huì)Emacs基本操作神凑,說好的3分鐘净神,其實(shí)都是騙人的,不過拿來入門是不錯(cuò)的溉委,感覺寫的挺好的鹃唯。或者直接看emacs的tutorial瓣喊,隨便你吧坡慌。加一個(gè),發(fā)現(xiàn)一篇很不錯(cuò)的文章藻三, 一年成為Emacs高手(像神一樣使用編輯器)洪橘。
然后我先去好好學(xué)習(xí)一些emacs的基本操作吧,等我一天棵帽,然后繼續(xù)來閑聊熄求。
ps:我用的mac,emacs版本24.5.1
Day 1 Emacs 基本操作
設(shè)置終端下的meta鍵
iTerm2 的話在 "Preferences" -> "Profiles" -> "your Profile" -> "Keys" -> 界面的右下角有關(guān)于 left/right option key 的映射配置逗概,改成 +Esc 就可以了弟晚。
系統(tǒng)自帶終端的話類似。linux的話應(yīng)該沒有這類問題逾苫。
光標(biāo)移動(dòng)
光標(biāo)移動(dòng)先掌握以下12個(gè)吧卿城,其他的再說,之后有時(shí)間可以搞個(gè)圖便于理解
ctrl 相關(guān)(小范圍內(nèi)的移動(dòng))
ctrl+p: 上一行 (previous)
ctrl+n: 下一行 (next)
ctrl+b: 前一個(gè)字符 (backward)
ctrl+f: 后一個(gè)字符 (forward)
ctrl+a: 行首 (a是第一個(gè)字母)
ctrl+e: 行尾 (end)
meta相關(guān)(mac改過配置之后就是alt/option鍵)
M+b: 向前一個(gè)單詞
M+f: 向后一個(gè)單詞
M+{: 段首
M+}: 段位
M+<: 文檔首
M+>: 文檔尾
還是再加幾個(gè)吧
ctrl+v: 下移一屏
M+v: 上移一屏
M+g M+g:Emacs會(huì)要求輸入行號(hào)铅搓,移動(dòng)光標(biāo)到指定行
好了瑟押,現(xiàn)在你可以在字符間自由的游動(dòng)了!優(yōu)秀狸吞!
至于設(shè)置行號(hào)顯示勉耀,只要在~/.emacs里面加上
;;show line number (global-linum-mode 1)
如果不行的話,那么可能你的emacs版本太低蹋偏,自己解決吧你便斥,或者升級(jí)一下吧。
刪除
刪除還是很重要的對(duì)不威始,嗯嗯對(duì)枢纠,好,那來學(xué)點(diǎn)刪除的命令吧
ctrl+d: 刪除光標(biāo)所在處字符
backspace: 刪除光標(biāo)前一個(gè)字符(這個(gè)就是我們常用的刪除鍵啦)
M+d: 刪除單詞光標(biāo)之后的部分
M+backspace: 刪除單詞光標(biāo)之前的部分
ctrl+k: 刪除從光標(biāo)到行尾
M+k: 刪除從光標(biāo)到句尾
感覺刪除還是沒有vim用起來方便啊黎棠,或者學(xué)的太少不習(xí)慣…
比如假如要?jiǎng)h除到行首怎么辦晋渺?不像vim那樣d+0就可以镰绎,你得怎么做?
首先你得先學(xué)一下選中這個(gè)命令
ctrl+@: 選擇
然后再按ctrl+a跳到行首木西,然后
ctrl+w剪切
M+w復(fù)制
ctrl+y 粘貼
好了畴栖,今天就學(xué)這么多吧,休息休息八千,該干嘛干嘛去吧:)
感覺好像偏離正題了吗讶,我們是要學(xué)習(xí)scheme的!好吧恋捆,emacs的操作就不再介紹了照皆,大家自己慢慢折騰去吧,先把最簡單的掌握了就好沸停。
ctrl+x ctrl+c: 保存并退出
如果想不保存退出的話膜毁,直接kill吧,ctrl+z
下面開始正式的學(xué)習(xí)啦愤钾,我用的自學(xué)教材是《計(jì)算機(jī)程序的構(gòu)造和解釋》瘟滨,當(dāng)當(dāng)、亞馬遜之類的一搜就有绰垂,不要吝惜那幾十塊錢哈室奏,買買買!
然后渣渣們做題不會(huì)了怎么辦劲装,看看大神們的答案吧…
Day 2 程序設(shè)計(jì)的基本元素
- 表達(dá)式
- 組合的方法
- 抽象的方法
前綴表達(dá)式的優(yōu)點(diǎn)
- 不會(huì)出現(xiàn)歧義
- 可以直接擴(kuò)充
環(huán)境所扮演的角色就是用去確定表達(dá)式中各個(gè)符號(hào)的意義胧沫。
定義的一般形式(define (<name> <formal parameters>) <body>)
過程應(yīng)用的代換模型
- 應(yīng)用序:先求值參數(shù)后應(yīng)用(lisp采用:避免對(duì)表達(dá)式的重復(fù)求值)
- 正則序:完全展開后歸約
來看一道題目:
ex1.5:
Ben Bitdiddle發(fā)明了一種檢測(cè)方法,能夠確定解釋器究竟采用的哪種序求值占业,是采用正則序绒怨,還是采用應(yīng)用序,他定義了下面兩個(gè)過程:
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
而后他求值下列的表達(dá)式:
(test 0 (p))
假如是應(yīng)用序的話就會(huì)死循環(huán)谦疾,假如是正則序則很快算出結(jié)果0南蹂。
在數(shù)學(xué)里,人們通常關(guān)心的是說明性的描述(是什么)念恍,而在計(jì)算機(jī)科學(xué)里六剥,人們則通常關(guān)心行動(dòng)性的描述(怎么做)。
比如平方根的問題峰伙,以下是代碼疗疟,大家感受一下。
(define (sqrt x)
(sqrt-iter 1.0 x))
(define (sqrt-iter guess x)
(if (good-enough? guess x)
guess
(sqrt-iter (improve guess x) x)))
(define (good-enough? guess x)
(< (abs (- guess x)) 0.001))
(define (improve guess x)
(average guess x))
(define (average x y))
(define (abs x)
(if (< x 0))
-x
x)
過程的形式參數(shù)名必須局部于有關(guān)的過程體瞳氓。
(待續(xù))