成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Lisp介紹之七個原始操作符

開發 開發工具
本文節選自《Lisp之根源》一文,描述了Lisp中的七個原始操作符。我們不僅要學習某個人四十年前得出的有趣理論結果,而且展示編程語言的發展方向。

本文是paul graham所著的《Lisp之根源》的第一部分,在對Lisp的介紹中,描述了Lisp中的七個原始操作符。這是一篇非常不錯的Lisp介紹文,值得一讀。

約翰麥卡錫于1960年發表了一篇非凡的論文,他在這篇論文中對編程的貢獻有如歐幾里德對幾何的貢獻.1 他向我們展示了,在只給定幾個簡單的操作符和一個表示函數的記號的基礎上, 如何構造出一個完整的編程語言. 麥卡錫稱這種語言為Lisp, 意為List Processing, 因為他的主要思想之一是用一種簡單的數據結構表(list)來代表代碼和數據.

值得注意的是,麥卡錫所作的發現,不僅是計算機史上劃時代的大事, 而且是一種在我們這個時代編程越來越趨向的模式.我認為目前為止只有兩種真正干凈利落, 始終如一的編程模式:C語言模式和Lisp語言模式.此二者就象兩座高地, 在它們中間是尤如沼澤的低地.隨著計算機變得越來越強大,新開發的語言一直在堅定地趨向于Lisp模式. 二十年來,開發新編程語言的一個流行的秘決是,取C語言的計算模式,逐漸地往上加Lisp模式的特性,例如運行時類型和無用單元收集.

在這篇文章中我盡可能用最簡單的術語來解釋約翰麥卡錫所做的發現. 關鍵是我們不僅要學習某個人四十年前得出的有趣理論結果, 而且展示編程語言的發展方向. Lisp的不同尋常之處--也就是它優質的定義--是它能夠自己來編寫自己. 為了理解約翰麥卡錫所表述的這個特點,我們將追溯他的步伐,并將他的數學標記轉換成能夠運行的Common Lisp代碼.

七個原始操作符

開始我們先定義表達式 .表達式或是一個原子 (atom),它是一個字母序列(如 foo),或是一個由零個或多個表達式組成的表 (list), 表達式之間用空格分開, 放入一對括號中. 以下是一些表達式:

  1. foo  
  2. ()  
  3. (foo)  
  4. (foo bar)  
  5. (a b (c) d) 

最后一個表達式是由四個元素組成的表, 第三個元素本身是由一個元素組成的表.

在算術中表達式 1 + 1 得出值2. 正確的Lisp表達式也有值. 如果表達式e 得出值v ,我們說e 返回 v . 下一步我們將定義幾種表達式以及它們的返回值.

如果一個表達式是表,我們稱第一個元素為操作符 ,其余的元素為自變量 .我們將定義七個原始(從公理的意義上說)操作符: quote,atom,eq,car,cdr,cons,和 cond.

(quote x ) 返回x .為了可讀性我們把(quote x )簡記 為'x . Lisp代碼

  1. > (quote a)  
  2. a  
  3. > 'a  
  4. a  
  5. > (quote (a b c))  
  6. (a b c) 

(atom x )返回原子t如果x 的值是一個原子或是空表,否則返回(). 在Lisp中我們按慣例用原子t表示真, 而用空表表示假. Lisp代碼

  1. > (atom 'a)  
  2. t  
  3. > (atom '(a b c))  
  4. ()  
  5. > (atom '())  

既然有了一個自變量需要求值的操作符, 我們可以看一下quote的作用. 通過引用(quote)一個表,我們避免它被求值. 一個未被引用的表作為自變量傳給象 atom這樣的操作符將被視為代碼:

  1. > (atom (atom 'a))  

反之一個被引用的表僅被視為表, 在此例中就是有兩個元素的表:

  1. > (atom '(atom 'a))  
  2. () 

這與我們在英語中使用引號的方式一致. Cambridge(劍橋)是一個位于麻薩諸塞州有90000人口的城鎮. 而``Cambridge''是一個由9個字母組成的單詞.

引用看上去可能有點奇怪因為極少有其它語言有類似的概念. 它和Lisp最與眾不同的特征緊密聯系:代碼和數據由相同的數據結構構成, 而我們用quote操作符來區分它們.

(eq x y )返回t如果x 和y 的值是同一個原子或都是空表, 否則返回(). Lisp代碼

  1. > (eq 'a 'a)  
  2. t  
  3. > (eq 'a 'b)  
  4. ()  
  5. > (eq '() '())  

(car x )期望x 的值是一個表并且返回x 的第一個元素. Lisp代碼

  1. > (car '(a b c))  

(cdr x )期望x 的值是一個表并且返回x 的第一個元素之后的所有元素. 

  1. > (cdr '(a b c))  
  2. (b c) 

(cons x y )期望y 的值是一個表并且返回一個新表,它的第一個元素是x 的值, 后面跟著y 的值的各個元素. Lisp代碼

  1. > (cons 'a '(b c))  
  2. (a b c)  
  3. > (cons 'a (cons 'b (cons 'c '())))  
  4. (a b c)  
  5. > (car (cons 'a '(b c)))  
  6. a  
  7. > (cdr (cons 'a '(b c)))  
  8. (b c) 

(cond ( ... ) ...( ... )) 的求值規則如下. p 表達式依次求值直到有一個返回t. 如果能找到這樣的p 表達式,相應的e 表達式的值作為整個cond表達式的返回值.

  1. > (cond ((eq 'a 'b) 'first)  
  2.         ((atom 'a)  'second))  
  3. second 

當表達式以七個原始操作符中的五個開頭時,它的自變量總是要求值的.2 我們稱這樣 的操作符為函數 .

以上就是Lisp介紹中有關其他原始操作符的描述。

【編輯推薦】

  1. 細數程序開發語言的七大奇跡
  2. Clojure編程語言 擴展你的Java想象力
  3. Scala將成為現代Web 2.0的發起語言
  4. Scala和Clojure,以及優秀的企業級語言之道
  5. 新型動態編程語言Snow簡介
責任編輯:yangsai 來源: Freeshell
相關推薦

2009-09-16 09:09:23

Linq Contai

2010-04-09 09:55:43

Oracle sqlp

2009-08-19 17:20:22

C# 操作符

2009-11-17 10:42:58

PHP操作符

2010-07-14 14:55:07

Perl操作符

2009-08-19 17:26:28

C# 操作符

2021-10-31 18:59:55

Python操作符用法

2009-07-21 09:31:00

Scala操作符

2009-09-15 17:16:58

LINQ查詢操作符

2010-07-14 14:18:51

Perl操作符

2012-02-06 09:13:23

LINQ

2011-04-08 16:26:14

JavaScript

2010-07-19 11:00:24

Perl操作符

2010-07-14 14:30:31

Perl操作符

2010-01-28 11:16:28

C++操作符

2009-08-19 17:33:35

C# 操作符

2010-01-27 11:00:17

C++操作符

2017-01-03 15:56:20

RxJava操作符Android

2022-10-08 07:49:55

New操作符函數

2009-11-27 09:41:56

LINQ
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 色婷婷一区二区三区四区 | 精品国产乱码一区二区三 | 久久国产综合 | 亚洲精品三级 | 亚洲国产精品成人 | 国产女人与拘做受免费视频 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 国内精品久久久久久 | 久久久久久久久久久久久九 | 国产91在线观看 | 国产精品久久久久久久午夜 | 成人视屏在线观看 | 亚洲国产精品99久久久久久久久 | 欧美色性 | 国产精品一级在线观看 | 成人二区 | 九九热久久免费视频 | 九九国产在线观看 | 成人深夜福利在线观看 | 亚洲天堂av一区 | 青青草视频免费观看 | 欧美一级久久精品 | 一区在线视频 | 女人精96xxx免费网站p | 国产精品久久久久国产a级 欧美日韩国产免费 | 久草青青草 | www.夜夜草| av av在线| 亚洲一区在线日韩在线深爱 | 国产伦精品一区二区三区精品视频 | 久久久久久国产一区二区三区 | 一级毛片播放 | 久久精品国产99国产精品 | 欧美日韩国产一区二区 | 日韩亚洲欧美综合 | 久久久男人的天堂 | 日p视频免费看 | 五月激情婷婷网 | 国产成人久久av免费高清密臂 | 成人av播放 | 中文字幕免费在线 |