为什么在函数调用之间保留此列表的内容?

时间:2017-03-10 03:26:05

标签: common-lisp literals clisp

我可能只是不理解Lisp的范围,但是我很难理解这个井字游戏中发生了什么,我已经简要介绍了这个问题:

(defun tic-tac-toe ()
  (let ((board '((- - -) (- - -) (- - -))))
    (draw-board board)
    (format t "~%")
    (make-move board)
    (draw-board board)))

(defun draw-board (board)
  (dolist (row board)
    (apply #'format (cons t (cons "~A ~A ~A~%" row)))))

(defun make-move (board)
  (setf (caar board) 'x))

tic-tac-toe函数旨在成为主要入口点,每次运行时,游戏都应该从头开始。但是,看看当我在CLISP中运行它时会发生什么:

[2]> (tic-tac-toe)
- - -
- - -
- - -

X - -
- - -
- - -
NIL
[3]> (tic-tac-toe)
X - -
- - -
- - -

X - -
- - -
- - -
NIL

第一次,电路板开始空白(所有破折号),但在此之后,电路板始终以剩余的旧值开始。这是怎么回事? let每次都不应该重新初始化董事会吗?

0 个答案:

没有答案