;;; -*- Mode:LISP; Package:INTERPRETER; Base:10; Readtable:CL -*-

(defvar *foo* 3)

((lambda (*foo* &optional (y *foo*)) y) 7)
((lambda (x &optional (y x)) (declare (special x)) y) 7)

(let ((*foo* 5) (x *foo*)) x)
(let* ((*foo* 5) (x *foo*)) x)

(eval-exp
  '(macrolet ((f (z) `(list 2 ,z 3)))
     (labels ((f (z) (* z z))
	      (g (z) (f z)))
       (g 5))))

(macrolet ((f (z) `(list 2 ,z 3)))
	     (flet ((f (z) (* z z))
		    (g (z) (f z)))
	       (g 5)))

(progv '(a b) '(3 3) b)
(let ((b 4)) (progv '(a b) '(3 3) b))
(let ((b 4)) (declare (special b)) (progv '(a b) '(3 3) b))

(progv '(a b) '(3) b)
(let ((b 4)) (progv '(a b) '(3) b))
(let ((b 4)) (declare (special b)) (progv '(a b) '(3) b))

(funcall (block foo (tagbody bar (return-from foo #'(lambda () (go bar))))))

(catch 'foo (throw 'foo 4))
(catch 'foo (block bar (throw 'foo 5)))
(catch 'foo (tagbody bar (throw 'foo 6)))
(catch 'foo (catch 'bar (throw 'foo 7)))

(let ((x 5) (funs '()))
  (dotimes (j 10)
    (push #'(lambda (z)
	      (if (null z) (setq x 0) (+ x z)))
	  funs))
  funs)

(kdefun fib (n)
  (cond ((= n 0) 1)
	((= n 1) 1)
	(t (+ (fib (- n 1))
	      (fib (- n 2))))))

(time '(labels ((fib (n)
		     (cond ((= n 0) 1)
			   ((= n 1) 1)
			   (t (+ (fib (- n 1))
				 (fib (- n 2)))))))
	 (fib 11)))

(declare)

(funcall '(lambda (x) `(list 'foo ,(cadr x))) '(gorp 3))

(defmacro baz (x) `(list ,x ,x ,x))
(baz 5)

(kdefvar *foo*)
(defmacro decls () (declare (special w x) (special y)) (declare (special z)))
(let (a b c *foo* w x y z) 'done)

(defmacro arithmetic-if (test neg-form zero-form pos-form)
  (let ((var (gensym)))
    `(let ((,var ,test))
       (cond ((< ,var 0) ,neg-form)
	     ((= ,var 0) ,zero-form)
	     (t ,pos-form)))))