;; objective-lisp: Object-oriented syntactic sugar for Lisp ;; ~keith (defpackage objective-lisp (:use common-lisp) (:export O!)) (in-package objective-lisp) (defconstant +open-char+ #\[) (defconstant +close-char+ #\]) (defmacro O! (root &rest forms) (let ((expr root)) (loop for entry on forms for form = (car entry) do (setf expr (cond ((consp form) `(,(car form) ,expr ,@(cdr form))) ((eq form :slot) (prog1 `(slot-value ,expr ',(cadr entry)) (unless (cdr entry) (error "Unexpected end of list (expected slot name)")) (rplacd entry (cddr entry)))) ((symbolp form) `(,form ,expr)) (t (error "Unexpected form ~S" form)) ))) expr)) (defun read-construct (stream char arg) "Read an objective-lisp construct." (declare (ignore char arg)) (macroexpand-1 (cons 'O! (read-delimited-list +close-char+ stream)))) ;(set-macro-character +open-char+ 'read-construct) (set-dispatch-macro-character #\# +open-char+ #'read-construct) (set-macro-character +close-char+ (get-macro-character #\)))