Common Lisp: динамические (специальные) переменные

Вместо тысячи слов:

package main

import (
	"log"
)

var global = 1

func main() {
        log.Println("Global before", global)
        func() {
                global := 2
                log.Println("Global in closure", global)
                test()
        }()
        log.Println("Global after", global)
}

func test() {
        log.Println("Global in test", global)
}

// Global before 1
// Global in closure 2
// Global in test 1
// Global after 1

(defparameter *global* 1)

(defun main ()
  (format t "Global before ~a~%" *global*)
  (funcall (lambda ()
             (let ((*global* 2))
               (format t "Global in closure ~a~%" *global*)
               (test))))
  (format t "Global after ~a~%" *global*))

(defun test ()
  (format t "Global in test ~a~%" *global*))

(main)

;; Global before 1
;; Global in closure 2
;; Global in test 2
;; Global after 1

SDL2 Уроки

В рамках моего текущего помешательства на лиспе занимаюсь адаптацией замечательной серии туториалов Lazy Foo на Comon Lisp. Для этого я пользуюсь библиотекой cl-sdl2. Так уж вышло, что поддержка некоторого функционала из SDL2, например surfaces, в ней реализована не полностью. Но это не беда, я дописываю нужный функционал по мере продвижения по туториалам, и мне даже дали доступ к мастер ветке репозитария. Поэтому не ставьте версию из quicklisp'а, а сразу клонируйте мастер ветку в ~/quicklisp/local-projects. Пока что я просто переписываю сишные туториалы на общелисп, за чем можно следить на гитхабе. Если хватит сил и терпения, или если появятся желающие, я напишу свои тексты с пояснениями, а может даже сниму видео. Такие дела.