Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- (defun send (object message &rest arguments) (apply object message arguments))
- (defmacro create-object ((&rest bindings) &rest methods)
- `(let ,bindings
- (lambda (message &rest arguments)
- (case message
- ,@(mapcar (lambda (method)
- `((,(first method))
- (destructuring-bind ,(second method) arguments
- ,@(cddr method))))
- methods)
- (otherwise (error "Unexpected message ~S" message))))))
- (pprint (macroexpand-1 '(create-object ((counter 0))
- (inc (&optional (n 1)) (incf counter n))
- (dec (&optional (n 1)) (decf counter n))
- (get () counter))))
- (let ((counter 0))
- (lambda (message &rest arguments)
- (case message
- ((inc) (destructuring-bind (&optional (n 1)) arguments (incf counter n)))
- ((dec) (destructuring-bind (&optional (n 1)) arguments (decf counter n)))
- ((get) (destructuring-bind nil arguments counter))
- (otherwise (error "Unexpected message ~S" message)))))
- (let ((o1 (create-object ((counter 0))
- (inc (&optional (n 1)) (incf counter n))
- (dec (&optional (n 1)) (decf counter n))
- (get () counter)))
- (o2 (create-object ((counter ""))
- (inc (&optional (n 1)) (setf counter (concatenate 'string counter (make-array n :element-type 'character :initial-element #\*))))
- (dec (&optional (n 1)) (setf counter (subseq counter 1)))
- (get () counter))))
- (send o1 'inc 3) (send o1 'dec)
- (send o2 'inc 3) (send o2 'dec)
- (values (send o1 'get) (send o2 'get)))
- 2
- "**"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement