ANSI Common Lisp 笔记一

决定还是去看  ANSI  Common Lisp 中文版。

摘自 《ANSI Common Lisp》

一、数据类型

Lisp中有其它语言所没有的两种类型:符号(symbol)和表(lists)。

符号是单词 (words)。无论你怎么输入,通常它们被转换成大写:

CL-USER> 'mike
MIKE
CL-USER>

注:输入 :abort 跳出错误


 列表 是由被括号包住的零个或多个元素来表示。元素可以是任何类型,包括列表。你必须引用列表,不然  Lisp 会以为这是一个函数调用。

在 Common Lisp中有两种方法来表示空的列表。可以用一对不包括任何东西的括号来表示,或者用符号nil来表示空表。


二、输入输出

最普遍的 Common   Lisp 输出函数是 format。它接受两个或两个以上的参数,第一个参数表示,输出要在哪里被打印,第二个参数是字串模版  (String Template),而剩下的参数,通常是要插入到字串模版对象的打印表示法  (printed  representation)。


三、局部变量和全局变量

用let来定义局部变量,用defparameter 来定义全局变量,通常在给全局变量命名时以*号开头以*号结尾。(可以用defconstant来定义一个全局常量)

如果要检查某个变量是否是一个全局变量或常量,用boundp。


四、赋值

通过setf可以给全局或者局部变量设置值。如果setf的第一个参数是一个符号(symbol),且这个符号不是某个局部变量的名字,那么setf将设置这个符号为全局变量。


五、作为对象的函数

1、函数在Lisp中就像符号、字串或列表那样稀松平常的对象。如果我们把一个函数的名字传给function,它会返回相关联的对象。

CL-USER> (function +)
#<Compiled-function + #x1000AA32F>

我们可以用 #' 作为function的缩写。

CL-USER> #' +
#<Compiled-function + #x1000AA32F>


2、我们可以把函数当作参数传入。一个接受函数作为参数的函数是apply。它接受一个函数和一个参数列表,并返回把传入函数应用在传入参数的结果:

CL-USER> (apply #' + '(1 2 3))
6

函数 funcall  做一样的事情但参数不需要包装成列表:

CL-USER> (funcall #' + 1 2 3)
6

CL-USER> (funcall #' + 1 2 3)
6


六、lambda表达式

一个 lambda 表达式是一个列表,包含符号 lambda,伴随着参数列表,与一个由零个或多个表达式所组成的主体。下面的 lambda 表达式代表一个接受两个数字,并返回它们的和的函数:
CL-USER> (lambda (x y)
  (+ x y))
#<Anonymous Function #x2100CB0E2F>

一个 lambda表达式可以被当成是函数的名字。就像普通的函数名称,lambda 表达式可以是函数调用的第一个元素:
CL-USER> ((lambda (x) (+ x 100)) 1)
101




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值