objective-lisp/objective-lisp.lisp

37 lines
1.3 KiB
Common Lisp
Raw Permalink Normal View History

2021-11-14 05:22:10 +00:00
;; objective-lisp: Object-oriented syntactic sugar for Lisp
;; ~keith
(defpackage objective-lisp
(:use common-lisp)
2022-02-22 04:50:53 +00:00
(:export O!))
2021-11-14 05:22:10 +00:00
(in-package objective-lisp)
2021-11-22 23:29:25 +00:00
(defconstant +open-char+ #\[)
(defconstant +close-char+ #\])
2022-02-22 04:50:53 +00:00
(defmacro O! (root &rest forms)
(let ((expr root))
(loop for entry on forms
for form = (car entry)
2022-02-22 15:35:49 +00:00
and prev-form = nil then form
unless (eq prev-form :slot)
do (setf expr
(cond ((consp form) `(,(car form) ,expr ,@(cdr form)))
((eq form :slot) (prog1 `(slot-value ,expr ',(cadr entry))
(unless (cadr entry)
(error "Missing slot name"))))
((symbolp form) `(,form ,expr))
(t (error "Unexpected form ~S" form)))))
;(format t "~S => ~S~%" `(O! ,root ,@forms) expr)
2022-02-22 04:50:53 +00:00
expr))
2021-11-22 23:29:25 +00:00
2022-02-22 04:50:53 +00:00
(defun read-construct (stream char arg)
2021-11-14 05:22:10 +00:00
"Read an objective-lisp construct."
2022-02-22 04:50:53 +00:00
(declare (ignore char arg))
(macroexpand-1 (cons 'O! (read-delimited-list +close-char+ stream))))
2021-11-14 05:22:10 +00:00
2022-02-22 04:50:53 +00:00
;(set-macro-character +open-char+ 'read-construct)
(set-dispatch-macro-character #\# +open-char+ #'read-construct)
(set-macro-character +close-char+ (get-macro-character #\)))