摘自 《Lisp语言- 陈光喜》
一、赋值
(1)let
Lisp中使用let来完成局部变量的定义。其形式为:(let ((var1 exp1)(var2 exp2)…(varn expn))
exps)
其中操作符 let 表明将定义局部变量。 (vari expi)对表示变量名 vari, 该变量的初始值为表达式 expi的值。Let 语句中的 exps 部分为表达式集合,完成所需要的处理。所定义的诸变量 var1,…,varn在这些表达式有效,即在 let 语句体内有效。整个 let 语句的返回值为语句体中最后一条语句的值。如:
>(let ((a 1) (b 2) (c (+ 5 3)))
(+ a (* b c))
(- (* a c) (* b c)))
>-8
(2)defparameter
defparameter用来实现全局变量定义。一般约定全局变量的命名为左右各写一个*号,如:
> (defparameter *var* 123)
>*VAR*
(3)defconstant
defconstant 用来定义全局常量,如:
>(defconstant c 12)
>C
要判断某个符号是否被定义为全局变量或常量,可以使用 boundp 来检验。例如:
>(boundp ‘c)
>T
(4)setf
setf是常用赋值操作符。对某个符号(没有定义为局部变量)首次使用setf赋值,该符号将被系统作为全局变量。这是一种隐式定义全局变量的方法,但是不值得提倡。
>(setf *var* 1234)
>1234
二、 输入输出
(1)Common Lisp 最常用输出命令是format。用法如下:
> (format t "~%The clever dog can do ~A + ~A =~A ." 2 35)
The clever dog can do 2 + 3 =5 .
NIL
Fortmat 的第一个参数是输出地,此例的参数 t 表示输出到 toplevel;第二个参数是输出格式串,~%
表示换行, ~A 表示该位置将用对应的参数进行替换。 Common Lisp 的打印格式串有多种控制符,如:
~A,~S,~P 是用于对象控制的。例如,
>(format t "~%TildeS prints ~S~%TildeA prints ~A " ‘ACL::asymbol ‘ACL::asymbol )
TildeS prints ACL::ASYMBOL
TildeA prints ASYMBOL
NIL
此例应注意~A 与~S 差别。~S 可以打印出控制符,而~A 不能。~P 打印复数后缀”s”。
~D ~B ~O ~X ~R 为整数控制符,它们分别打印十进制、二进制、八进制、十六进制、基数。
> (format nil " ~D ~B ~O ~X ~R" 12 12 12 12 12)
" 12 1100 14 C twelve"
~E ~F ~G ~$为浮点数控制符,分别按照指数格式、定点式、浮点式、浮点定点结合方式。例,
> (format nil " ~E ~F ~G ~$" 123450 123450 123450 123450)
" 1.2345E5 123450.0 123450. 123450.00"
> (format nil " ~E ~F ~G ~$" 123.450 123.450 123.450 12.3450)
" 1.2345E2 123.45 123.45 12.35"
~n%,~n&,~| 为空白控制符,分别表示 n 换行,n-1 行,新一页。
> (format nil "begin ~2% and ~2&end")
"begin
and
end "
值得注意的是,在上述例子中,format 的第一个参数为 nil 时,打印执行后返回值不出现 nil;而参数
为 t 时,打印执行后返回值出现 nil> (SETF A (READ))12
12 ,这就是所谓 Lisp 的副产品
(2)Common Lisp的标准输入运算符是read ,如:
> (SETF A (READ))
>12