初学lisp

先贴张图膜拜一下


John McCarthy

1958年,John McCarthy设计了Lisp,半个世纪过去了,而今最新潮的语言也只是实现了lisp的设想。虽然流行程度不是很高,但对Lisp的评价却是颇高。lisp究竟是一门什么样的编程语言?

Lisp名称源自列表处理(LISt Processing)的英语缩写,是基于λ演算所创造的。McCarthy的本意并不是要设计一门编程语言,而是要做一种理论演算,用更简洁的方式定义图灵机。

Lisp在设计之初就有过人之处:

  • 条件结构(即"if-then-else"结构)。现在大家都觉得这是理所当然的,但是Fortran I就没有这个结构,它只有基于底层机器指令的goto结构。
  • 函数也是一种数据类型。在Lisp语言中,函数与整数或字符串一样,也属于数据类型的一种。它有自己的字面表示形式(literal representation),能够储存在变量中,也能当作参数传递。一种数据类型应该有的功能,它都有。
  • 递归。Lisp是第一种支持递归函数的高级语言。
  • 变量的动态类型。在Lisp语言中,所有变量实际上都是指针,所指向的值有类型之分,而变量本身没有。复制变量就相当于复制指针,而不是复制它们指向的数据。
  • 垃圾回收机制。
  • 程序由表达式(expression)组成。Lisp程序是一些表达式区块的集合,每个表达式都返回一个值。这与Fortran和大多数后来的语言都截然不同,它们的程序由表达式和语句(statement)组成。ruby就采用了这种机制
  • ...

《黑客与画家》内有一段:“至于Ruby,如果回到1975年,你声称它是一种Lisp方言,没有人会反对”。作为一个ruby程序员,应该对Lisp有所了解。

Lisp的语法很简洁,几乎就是他的名字-表处理,程序代码与数据的形式完全相同,以圆括号为边界的表。插一个笑话:说苏联和美国太空竞赛的时候,克格勃费劲千辛万苦,从NASA偷了一页的源代码,拿回去一看,好嘛,是Lisp代码的最后一页,满纸都是 “)”。

闲话少说,下面来一些干货,介绍一下lisp的语法:

1 表达式

如上所说,Lisp的表达式其实就是“表”

123 ;值是表达式
(+ 3 2)  ;操作符在前,后边参数以空格隔开
(+ 3
      (* 10 12)) ;组合式 3+ (10 * 12)

2 命名

以Scheme(Lisp方言,下同)为例
(define size 2),定义变量size并赋值2

3 定义过程

过程定义形式一般如下:
(define (<名字> <参数(可多个)>) (<实现>))
例如(define (square x) (* x x))就定义了square过程,可以求平方(square 3)会得到9

4 条件表达式

条件表达式的一般过程如下
求x绝对值为例

(cond ((> x 0) x)
           ((= x 0) 0)
           ((< x 0 ) (- x)))
;也可以这样
(cond ((< x 0) (- x))
            (else x))
;还可以这样
(if (< x 0) 
     (- x)
     x)

逻辑复合运算符 and or not
(and (> x 0) (< y 0))
(or (> x 0) (< y 0))

了解了以上知识,下面我们来个稍微复杂点的练习,用牛顿迭代法求平方根

;先定义判断已求的平方根是不是已够精确
(define (good-enough? guess x)
              (< (abs (- x (square guess))) 0.001))
;定义无限逼近的方法
(define (average x y) 
              (/ (+ x y) 2))
;定义改进方法
(define (improve guess x)
              (average guess (/ x guess)))
;定义求平方根递归
(define (sqrt-item guess x)
              (if (good-enough? guess x)
                    guess
                    (sqrt-item (improve guess x)
                                        x)))
;定义求平方根方法
(define (sqrt x)
              (sqrt-item (/ (* 1.0 x) 2)
                                  x))

效果如下:


Paste_Image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容