(defun kons (kar kdr) (cons kar kdr)) (defun kar (kons) (car kons)) (defun kdr (kons) (if (typep (cdr kons) 'function) (setf (cdr kons) (funcall (cdr kons))) (cdr kons))) (defmacro named (name form) (let ((value (gensym)) (thunk (gensym))) `(let ((,value)) (labels ((,thunk () (or ,value (setf ,value (symbol-macrolet ((,name (lambda () (,thunk)))) ,form))))) (,thunk))))) (let ((c (named foo (kons (gensym "A") (kons (gensym "B") foo))))) (loop :repeat 20 :for l = c :then (kdr l) :do (print (kar l))) (let ((*print-circle* t)) (print c)))