LISP基础
来源:互联网 发布:js触发a标签href跳转 编辑:程序博客网 时间:2024/05/17 03:36
作业部落 与 简书 同步发布
部分摘录于《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
表达式还允许我们使用匿名函数。
- LISP基础
- Emacs Lisp基础数据类型
- emacs lisp 基础 1
- emacs lisp 基础 2
- LISP 6.1 变量的基础
- Lisp
- Lisp
- lisp
- LISP
- LISP
- lisp
- Lisp中基础函数的意思
- Lisp基础函数:car, cdr, cons...
- Lisp中car,cdr和cons都是基础函数。cons用于构造lists,car和cdr用于分割lisp。
- 用Lisp解释Lisp
- Lisp.扩展Lisp
- Lisp.为什么使用Lisp
- Lisp.扩展Lisp
- 五种循环调戏QQ
- remove
- 黑马程序员——Objective-C学习之无序集合(NSSet\NSMutableSet)
- Selenium_Python实例代码(2)
- cocos2d-js中Chipmunk物理引擎相关(1)
- LISP基础
- Selenium_python实例代码(3)
- [PHP][PrestaShop]CSS/JS合并
- Chrome 扩展程序 最近历史 HistoryBar v1.2
- 清空的手机存储卡数据如何恢复呢
- impala compute 命令
- JSFL集合
- webview与js交互
- 定制SWT/RCP界面(java UI思路拓展rcp/swt)