LISP基础


部分摘录于《ANSI COMMON LISP》、《LISP语言(陈光喜)》


变量与赋值

  • let来完成局部变量的定义,形式如下:
(let ((var 1 exp1) (var2 exp2) ... (varn expn)) exps)

其中,(vari expi)表示对于变量名vari,该变量的初始值为表达式expi的值。let语句中的exps部分为表达式集合,完成所需要的处理。整个let语句的返回值为语句体中的最后一条语句的值。

函数的表示

函数表示为(lambda (p1...pn) e),其中(p1...pn)是原子,也叫参数,e是表达式。
如果一个表达式的第一个元素形式如上所示:

((lambda (p1...pn) e) a1...an)

则称为函数调用。它的计算过程如下:每个表达式ai先求值,然后e在求值。在e的求值过程中,每个出现在e中的pi值是对应相应的ai在最近一次的函数调用中的值。

有另外一种函数极好使得函数能提及它自身,这样我们能更方便地定义递归函数

(label f (lambda (p1...pn) e))

记号f表示一个像(lambda (p1...pn) e)那样的函数,这样,任何出现在e中的f将求值为此label表达式,就像f是此函数的参数。

假设定义函数(subst-new x y z),它使用表达式x,原子y和表z作为参数,返回一个像z那样的表,不过z中出现的y需要被x代替。

(label subst-new (lambda (x y z)
                    (cond ((atom z)
                            (cond ((eq z y) x)
                                ('t z)))
                            ('t (cons (subst-new x y (car z))
                                      (subst-new x y (cdr z)))))))

我们简记f=(label f (lambda (p1...pn) e))为:

(defun f (p1...pn) e)

于是:

(defun subst-new (x y z)
    (cond   ((atom z)
                (cond ((eq z y) x)
                    ('t z)))
            ('t (cons   (subst-new x y (car z))
                        (subst-new x y (cdr z))))))

变量

let是CommonLisp里最常用的操作符之一,它让你引入新的局部变量

> (let ((x 1) (y 2))
    (+ x y))
3

这些变量只有在let体内有效。变量和值的列表后面是一组表达式,它们被依此求值。

通过传给defparameter一个符号和一个值,可以构造全局变量:

> (defparameter *glob* 99)
*GLOB*

习惯上全局变量的名字以星号开始和结束。

可以使用defconstant定义全局变量:
(defconstant limit (+ *glob* 1)

如果想知道某个符号是否是全局变量或常数的名字,请使用boundp

> (boundp '*glob*)
T

赋值

CL中最普通的赋值操作符是setf。我们可以用它对全局或局部变量进行赋值

> (setf *glob* 98)
98
> (let ((n 10))
    (setf n 2)
    n)
2

需要注意的是,如果要对一个变量赋值,必须先用let或者defparameter声明变量,否则会报warning。

函数式编程法

编写通过返回值来工作的程序,而不是它们的副作用。你使用副作用越少,你就越进步。

迭代

do宏是CL中最基本的迭代操作符。

(defun show-squares (start end)
    (do ((i start (+ i 1)))
        ((> i end) 'done)
        (format t "~A ~A ~%" i (* i i))))

上述代码中do宏只创建了一个变量i。第一次迭代时,i被赋予start的值,以后的迭代里,i的值每次增加1

函数作为对象(Function as Objects)

LISP里函数和符号、字符串或列表一样,是稀松平常的对象。如果我们把函数名字传给function,它会返回相关联的对象。和quote类似,function是一个特殊操作符。

> (function +)
#<Compiled-Function + 17BA4E>

可以使用#'作为function的缩写,这个缩写称为升引号(sharp-quote)。

lambda

lambda表达式不是一个操作符,而只是一个符号。早期用于辨别列表与函数。Common Lisp里,你可以直接用列表来表达函数,函数在内部会被表示成独特的函数对象,因此不再需要lambda了。
((x) (+ x 100))
但Lisp程序员习惯用符号lambda来撰写函数,因此为了传统而保留了lambda

defun

defun宏,创建一个函数并给函数命名。但函数不需要有名字,而且我们不需要defun来定义它们。我们可以直接引用函数,要直接饮用一个函数,我们使用所谓的lambda表达式。

(lambda (x y)
    (+ x y))

lambda表达式可以是函数调用的第一个元素,lambda表达式还允许我们使用匿名函数。

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

推荐阅读更多精彩内容