(require 'stdlib) (defvar ant (list "Rufus" (lambda () (* 6 7)))) (puts ant) (defun m-eval (a) (puts (car a)) (puts (funcall (car (cdr a)))) ; invoke the closure ) (m-eval ant) ;; passing a closure as a param (defun exec (proc) (funcall proc)) (exec (lambda () (puts "hopsa"))) ;; ant-object using define's ;; TODO very much refactorable into a macro (define (make-ant) (let ((name "") (position '(0 0)) (vocal-chords nil)) (define (set-name v) (setq name v)) (define (set-position v) (setq position v)) (define (set-vocal-chords proc) (setq vocal-chords proc)) (define (talk) (funcall vocal-chords)) (define (inspect) (format nil "(Ant %s %s %s)" name position vocal-chords)) (define (dispatch msg) (cond ((eq msg 'set-name) set-name) ((eq msg 'set-position) set-position) ((eq msg 'inspect) inspect) ((eq msg 'set-vocal-chords) set-vocal-chords) ((eq msg 'talk) talk) (t (error "ant: unknown msg: %s" msg)))) dispatch)) (define (set-name ant value) ((ant 'set-name) value)) (define (set-position ant value) ((ant 'set-position) value)) (define (inspect ant) (funcall (ant 'inspect))) (define (set-vocal-chords ant proc) ((ant 'set-vocal-chords) proc)) (define (talk ant) (funcall (ant 'talk))) (defvar jack (make-ant)) (puts (inspect jack)) (set-name jack "Jack Wowbagger III") (set-position jack '(3 4)) (puts (inspect jack)) (set-vocal-chords jack (lambda () (puts "Wow, la dih dah!"))) (puts (inspect jack)) (talk jack)