亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
123下一頁
最近訪問板塊 發(fā)新帖
查看: 4926 | 回復(fù): 24
打印 上一主題 下一主題

請教基本概念 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-11-14 16:44 |只看該作者 |倒序瀏覽
對于(setq b 1)
可以理解定義了一個變量b值為1

但是
quote究竟該怎么理解呢?
比如
(cons 'a 1)

a究竟是什么?


論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
2 [報告]
發(fā)表于 2012-11-14 19:11 |只看該作者
symbol 就好像在 C 里面字符串常量要寫做 "string" 沒有雙引號就成個變量,quote 也就相當于雙引號,是個語法。

論壇徽章:
46
15-16賽季CBA聯(lián)賽之四川
日期:2018-03-27 11:59:132015年亞洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49雙魚座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亞冠之布里斯班獅吼
日期:2015-07-13 10:44:56
3 [報告]
發(fā)表于 2012-11-14 19:22 |只看該作者
比如你在代碼中寫

a

lisp 就知道你想要的是變量 a 的值,如果寫作

'a

lisp 就會理解為你想要 a 這個 symbol。

論壇徽章:
0
4 [報告]
發(fā)表于 2012-11-15 11:59 |只看該作者
回復(fù) 1# sanbiangongzi

'a 即 (quote a) 表示"a"這個表示定義成了一個symbol。
從理論上來說,symbol和string的區(qū)別在于是否intern,翻譯成人話就是:把該string放到一個特殊的表里面成為一個不變量,然后我們稱這種方式處理過的string為symbol,這個處理過程叫intern。

這種處理最大的好處在于,由于symbol在全局是唯一的,所以比較兩個symbol的時候只需要比較其值字符串的首地址就可以了,所以類lisp里面會大量使用symbol來提高效率。
比如:
(define a 'asdfadsfsadfashfjasfsdfadsfasdf)
(define b 'adsjsjfalkdsjfasjsafjiwjrwerper)
當比較a和b的時候,不會像string那樣去逐個比較,而是直接比較兩個字符串的首地址(該地址存在于一個全局表中,任何函數(shù)都可以引用)。

壞處在于,symbol搞得太多你就有很多無法回收的字符串數(shù)據(jù),占用內(nèi)存。

PS:這只是理論,實際上各種實現(xiàn)會根據(jù)自己的策略做了優(yōu)化處理,并不是所有symbol都會intern并且未必保證immutable。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
5 [報告]
發(fā)表于 2012-11-15 19:11 |只看該作者
這是functional版,不是某種lisp的版。。。 lisp有很多種的。。。  即使是同一種lisp語言,也有不同實現(xiàn)的。。。
LZ你給的代碼不能區(qū)分到底是emacs lisp還是common lisp或者是其他什么沒那么出名的lisp。。。

一般來說,有一些關(guān)鍵點:
1. symbol是一個獨立的類型
2. 只是大多數(shù)lisp恰好用它來滿足變量的用途
3. 當symbol被求值時, 就是當作變量
4. 當symbol不被求值時, 就是當作symbol本身
5. 少數(shù)的operator —— 就是可以出現(xiàn)在list的第1元素上的東西, 各種lisp對這個東西的叫法也不一樣 —— 對參數(shù)的求值有特殊規(guī)定
6. quote就是這樣的operator之一, 對(quote a)求值得到a這個symbol本身, 對a求值得到的是a變量的值。
7. cons會對所有參數(shù)求值, 所以 (let ((a 12)) (cons a (quote a))) 的結(jié)果就是一個con cell, car是12這個number, cdr是a這個symbol
8. ’是一個reader marker —— 各種lisp里的叫法也有不同 —— 'a 會被reader 讀取為 (quote a)。 所以(cons 'a 1) 和 (cons (quote a) 1)是相同的, 被求值后都得到一個con cell, car是a這個symbol, cdr 是 12 。
9. (setq b 1) 不會對第1個參數(shù),即b求值, 但會對 第2個參數(shù), 即1求值。
產(chǎn)生的效果就是b這個symbol如果被求值就會得到1。
(setq b (+ 12 26)) 的話, 如果b被求值就會得到38, 而不是(+ 12 26), 因為第2個參數(shù)是會被求值的。
10. setq 中的 q 就是 quote 的意思。。。

論壇徽章:
0
6 [報告]
發(fā)表于 2012-11-16 09:30 |只看該作者
OwnWaterloo 發(fā)表于 2012-11-15 19:11
這是functional版,不是某種lisp的版。。。 lisp有很多種的。。。  即使是同一種lisp語言,也有不同實現(xiàn)的。 ...



感謝樓上幾位的回復(fù),比以前明白了些,
但是還是很模糊, 向通過一種lisp的實現(xiàn)
來理解這些概念
看了一下emacs的C源碼,實在不好讀懂,
有沒有其他lisp的比較容易理解的實現(xiàn)推薦一下。





TO OwnWaterloo: 是Emacs lisp

論壇徽章:
0
7 [報告]
發(fā)表于 2012-11-16 10:10 |只看該作者
回復(fù) 6# sanbiangongzi

你最好從Scheme開始,Scheme本來就是適合于教學(xué)的。
一個可實用的Scheme只需要6千行不到的代碼(或許還能更精簡),你想從源碼級別開始研究推薦tinyScheme。
各種Lisp方言風格各異,從主流的入手會比較靠譜,資料和標準都有。

或者你想盡快上手一門可以馬上用來做事的語言,可以考慮這個:
https://www.coursera.org/course/progfun

PS:我建議你還是先完成SICP。

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
8 [報告]
發(fā)表于 2012-11-16 14:14 |只看該作者
回復(fù) 6# sanbiangongzi

個人認為無論什么語言,實現(xiàn)方式并不是理解語言的唯一途徑,甚至是一條很差的途徑。
呃,如果目的就是語言實現(xiàn)而不是語言本身那就是另外一回事了。

至于lisp的推薦。。。
如果你要用emacs,肯定學(xué)emacs lisp是最實用的。


如果要general purpose programming。。。
推薦clojure。。。  它的缺點就是依賴java,所以java的一些缺點就沒法避免。。。 比如體積。。。 JRE是必須的。。。


如果是語言研究,可以從scheme開始。
這貨在很多方面概念都很簡單。
比如沒有emacs lisp和common lisp那樣的function cell和value cell之分, 沒有l(wèi)exical scope和dynamic scope之分。
但又有很多其他lisp不支持的continuation, 完爆common lisp里的各種亂得死人的(包括goto)控制結(jié)構(gòu)。

但最好還是再搭配一個別的lisp來學(xué)。。。  因為scheme和其他的lisp太不一樣了。。。很多人都不把scheme算到lisp里的。
lisp最獨特的地方,宏,scheme恰好復(fù)雜得像一坨屎。
scheme在作用域控制上也復(fù)雜得一坨。。。  但又不支持el,cl,clojure都支持的動態(tài)作用域(它們?nèi)叨际腔旌闲偷模?br /> 而且,scheme這語言沒有實用性。racket這語言實現(xiàn)也沒有實用性。完全是渣渣。
scheme被很多人夸大了(我以前也是其中一員),直到真正用racket開始寫點東西后發(fā)現(xiàn)scheme適合講學(xué),也只適合在學(xué)院里講學(xué)。

說到functional programming,很多人就想到scheme。。。而scheme在這方面除了continuation,就沒其他優(yōu)勢了。
first class function? scheme支持, 但誰不支持?
列表操作、immutable value、pure function、lazy evaluation, 它哪樣支持了?
哦,它不是不支持, 而是 1) roll your own 2) implementation detail 。

算了,打住。。。 scheme不是不好, 而是被吹捧得太過, 不值那個價。
總之, scheme的哲學(xué) —— 將語言限制降低 —— 是對的。
但因為語言限制盡可能低,所以語言就可以只提供極少的feature,因為不夠的程序員可以自己加 —— 這是學(xué)院派的天真想法, 也只適合教學(xué)。 教你怎么在一個簡單的語言內(nèi)核上實現(xiàn)各種feature。
投入實際環(huán)境中時, 就會出現(xiàn)各種不兼容的feature的實現(xiàn), 就沒有scheme語言, 只有racket, gambit, guile。。。 甚至在同一個語言里, 也有不同不兼容的風格。。。
本來scheme就很小眾了, 再這么折騰, 還搞個屁啊。

論壇徽章:
0
9 [報告]
發(fā)表于 2012-11-16 14:26 |只看該作者
笑而不語   (padding for posting 000000000)

論壇徽章:
2
青銅圣斗士
日期:2015-11-26 06:15:59數(shù)據(jù)庫技術(shù)版塊每日發(fā)帖之星
日期:2016-07-24 06:20:00
10 [報告]
發(fā)表于 2012-11-16 14:59 |只看該作者
回復(fù) 6# sanbiangongzi

一吐槽scheme就忘主題了。。。

具體到emacs lisp就很好說明了。el的執(zhí)行是完全分為兩步的。

代碼文件中的: (cons 'a 1) , 如果該文件被加載, 就與(eval (read "(cons 'a 1)")) 等效。
首先是將代碼文件中的字符流"(cons 'a 1)" —— 左括號, c, o, n ... 右括號 —— 讀取為內(nèi)存中的lisp object, (cons (quote a) 1) —— 一個三元素的列表,元素依次是cons(symbol), (quote a)(又一個列表,元素是quote符號和a符號), 1(number)。

然后就是求值,eval。不同類型的lisp object求值方式不同。
1. self evaluating, 比如number, string, vector。。。
對它們求值,返回這個lisp object本身。
2. symbol
el中的symbol有4個域, function cell, value cell, property list, 以及symbol name。對symbol求值就得到它的value cell。
3. list
對list求值就有點類似函數(shù)調(diào)用, 第1個元素的解釋還比較復(fù)雜, 具體到這個問題其實只與后續(xù)元素的求值(即"參數(shù)")有關(guān)。
大多數(shù)時候,參數(shù)會被從左往右依次求值,并傳遞這個求值結(jié)果。
少部分special form對參數(shù)求值有特殊規(guī)定, macro對所有參數(shù)都不求值。
4. intern還有這一個關(guān)鍵概念前面忘記說了。
a, cons, b 等等都是interned symbol的read syntax。 讀取,即(read "a")等,得到的是interned symbol。
不需要被它的名字嚇到, lisp里有許多奇奇怪怪的名字。。。 它的目的就是保證代碼中的所有a,讀取后得到的都是同一個symbol object。
與之對應(yīng)的是unintened symbol, 它們也都是symbol, 也有那4個域, 但可能就是不同的symbol object。

(read "(progn (setq b 1) b)") 得到一個list。 這個list中的兩個b symbol是同一個symbol object。
如果對這個list求值, 即(eval (read "(progn (setq b 1) b)")), 首先是對progn求值。 progn 又會對它的參數(shù) —— (setq b 1), b —— 依次求值,并返回最后一個參數(shù)的求值結(jié)果。
對(setq b 1)求值,就是將b這個symbol的value cell設(shè)置為1; 再對b求值,就是將同一個symbol的value cell取出, 就得到1了。
所以symbol 就可以用作變量 —— 一些地方用set, setq等設(shè)置symbol object的value cell, 另一些地方對同一個symbol object求值就取出value cell。
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP