diff --git a/objective-lisp.lisp b/objective-lisp.lisp index d576896..e6156ee 100644 --- a/objective-lisp.lisp +++ b/objective-lisp.lisp @@ -14,14 +14,16 @@ (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)) - (rplacd entry (cddr entry)))) - ((symbolp form) `(,form ,expr)) - (t (error "Unexpected form ~S" form)) - ))) + 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) expr)) (defun read-construct (stream char arg)