Lisp Common Lisp,
Lisp , Common Lisp , , On Lisp Common Lisp. CLiki . Lisp , , ( ):
(. 267) . Lisp. Lisp, . , . ( , # # 'identity - ):
- cont , let :
( defvar actual-cont # ')
(define-symbol-macro * cont * * actual-cont *) - (setq * cont * # 'identity) (= somefun#' values ...)
- ...
, , , . , :
- 268 of < Lisp > ... comp.lang.lisp 2006 , (setq * cont *...) (defvar * cont *...). , On Lisp ANSI Common Lisp.
?
(= bind...) ( ((* cont *...))...), , * cont * - (.. ), , let, * cont *, , , . * cont * , :
CONTINUATIONS> (=bind (node1) (dft-node '(a (b (d h)) (c e (f i) g)))
(if (eq node1 'done)
'done
(=bind (node2) (dft-node '(1 (2 (3 6 7) 4 5)))
(list node1 node2))))
(A 1)
CONTINUATIONS> (restart)
2
CONTINUATIONS> (restart)
3
CONTINUATIONS> (restart)
6
CONTINUATIONS> (restart)
7
CONTINUATIONS> (restart)
4
CONTINUATIONS> (restart)
5
CONTINUATIONS> (restart)
B
CONTINUATIONS> (restart)
D
, (a 1) * * . - , , * cont *, , , # 'identity, = bind. 2, 3,... . * * - , B.
, (a 1), (a 2),..., (b 1) .. , , () , * cont * , .. . , * cont * ; , . Lisp, . 268:
*cont*, . *cont* , , : *cont* , =values , =defun. , add1 *cont* , . , , *cont* . *cont* setq defvar: .
Lisp Common Lisp, , Common Lisp , , (setq * cont *...) . Common Lisp . , , defparameter defvar, . , . , , , .
. , SBCL (setq *cont* …), ": undefined variable: CONTINUATIONS:: * CONT *" , * cont *, " (:: * CONT *), , ( * FOO *) ".
?
, , , , On Lisp:
(defparameter *restarts* '())
(defun do-restart ()
(if (endp *restarts*) nil
(funcall (pop *restarts*))))
(defun traverse-tree (k tree)
(cond
((null tree) (do-restart))
((atom tree) (funcall k tree))
(t (push (lambda () (traverse-tree k (cdr tree))) *restarts*)
(traverse-tree k (car tree)))))
- * *. :
CL-USER> (traverse-tree 'identity '((1 2) (3 4)))
1
CL-USER> (do-restart)
2
CL-USER> (do-restart)
3
CL-USER> (do-restart)
4
CL-USER> (do-restart)
NIL
, , :
CL-USER> (let ((k (lambda (num)
(traverse-tree (lambda (alpha)
(list num alpha))
'(a (b) c)))))
(traverse-tree k '((1 2) 3)))
(1 A)
CL-USER> (do-restart)
(1 B)
CL-USER> (do-restart)
(1 C)
CL-USER> (do-restart)
(2 A)
CL-USER> (do-restart)
(2 B)
CL-USER> (do-restart)
(2 C)
CL-USER> (do-restart)
(3 A)
CL-USER> (do-restart)
(3 B)
CL-USER> (do-restart)
(3 C)
CL-USER> (do-restart)
NIL
, * cont *, , let, .
, ( k , , , , gensym), , " = bind, .