变量

;;;;词法变量lexical和动态变量dynamic
;;;;大体对应局部变量和全局变量
;;;;一个变量可以保存任何类型的值,所有值都是对象的引用
;;引入新变量LET,执行顺序,先求初值,然后绑定。LET体内用绑定的值,退出let体用原来的值。
;;let体最后一个表达式的值作为let值返回,每次进入let体变量重新绑定。
; (let (variable*)
; body-form*)
 
; (let ((x 10) (y 20) z)
; ...)
(defun foo (x)
  (format t "parameter:~a~%" x)
  (let ((x 2))
    (format t "outter let:~a~%" x)
    (let ((x 3))
      (format t "inner let:~a~%" x))
    (format t "outter let:~a~%" x))
  (format t "parameter:~a~%" x))
 
(dotimes (x 10) (format t "~d" x));输出0123456789
;;let*变体;后面的初始值可以用到前面早先引入的变量
(let* ((x 10)
       (y (+ x 10)))
  (list x y))
;;如果非用let就得用嵌套
(let ((x 10))
  (let ((y (+ x 10)))
    (list x y)))
;;闭包
(defparameter *fn* (let ((count 0)) #'(lambda () (setf count (1+ count)))))
(funcall *fn*)
 
;*fn*作为一个返回函数用到了其外层let的变量,当函数执行完毕,还会保留其外层的绑定。
;匿名函数是一个闭包,它封闭包装了let创建的绑定。一个闭包不但可以访问他闭合的变量的值,
; 还可以对其赋予闭包被调用时不断变化的值
 
;;;;动态变量
; 定义全局变量的方式,变量名 初始值 文档字符串
(defvar *count* 0
  "count of widgets made so far.")
(defparameter *gap-tolrence* 0.001
  "sfsfsf.")
; 区别
; defparameter总是赋初值
; defvar只有在变量未定义才赋初值,前面已经defvar了则重新赋值不起作用。
; defvar可以不写初值(未绑定的)
; 重设defvar的值,需要setf或者先(markunbound)再defvar
 
(defvar *x* 10)
(defun foo () (format t "~d" *x*))
(foo)
(let ((*x* 20)) (foo))
(foo)
;;;;常量 所有常量都是全局的
(defconstant +hellocount+ 10)
;;;;赋值--setf宏
(setf place value)
;可以对多个赋值 如(setf x 1 y 2 z 3)
;setf返回最近的赋值,
(setf x (setf y (random 10)))
;;;;广义赋值--setf可以为任何位置赋值
;可以用正常获取其值相同的方法获取位置
; simple variable: (setf x 10)
; array: (setf (aref a 0) 10)
; hash: (setf (gethash 'key hash) 10)
; slot name field:(setf (field o) 10)
;被修改的位置对之前保存在该位置上的对象毫无影响
;其他操作符 incf decf 宏 修改宏 建立在setf上 语法简洁
(incf x) ==== (setf x (+ x 1))
(decf x) ==== (setf x (- x 1))
(incf x 10) ==== (setf x (+ x 10))
; 一下两个可以接收任何多的参数
; rotatef 在位置之间轮换他们的值
; shiftf 左移
(rotate a b)
(shiftf a b 10)
(let ((tmp a)) (setf a b b 10) tmp)
; over



posted @ 2012-04-11 08:43  舜耕山翁  阅读(148)  评论(0编辑  收藏  举报