Advertisement
Guest User

Untitled

a guest
Aug 3rd, 2018
170
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.72 KB | None | 0 0
  1. (defun send (object message &rest arguments) (apply object message arguments))
  2.  
  3. (defmacro create-object ((&rest bindings) &rest methods)
  4. `(let ,bindings
  5. (lambda (message &rest arguments)
  6. (case message
  7. ,@(mapcar (lambda (method)
  8. `((,(first method))
  9. (destructuring-bind ,(second method) arguments
  10. ,@(cddr method))))
  11. methods)
  12. (otherwise (error "Unexpected message ~S" message))))))
  13.  
  14. (pprint (macroexpand-1 '(create-object ((counter 0))
  15. (inc (&optional (n 1)) (incf counter n))
  16. (dec (&optional (n 1)) (decf counter n))
  17. (get () counter))))
  18.  
  19. (let ((counter 0))
  20. (lambda (message &rest arguments)
  21. (case message
  22. ((inc) (destructuring-bind (&optional (n 1)) arguments (incf counter n)))
  23. ((dec) (destructuring-bind (&optional (n 1)) arguments (decf counter n)))
  24. ((get) (destructuring-bind nil arguments counter))
  25. (otherwise (error "Unexpected message ~S" message)))))
  26.  
  27.  
  28. (let ((o1 (create-object ((counter 0))
  29. (inc (&optional (n 1)) (incf counter n))
  30. (dec (&optional (n 1)) (decf counter n))
  31. (get () counter)))
  32. (o2 (create-object ((counter ""))
  33. (inc (&optional (n 1)) (setf counter (concatenate 'string counter (make-array n :element-type 'character :initial-element #\*))))
  34. (dec (&optional (n 1)) (setf counter (subseq counter 1)))
  35. (get () counter))))
  36. (send o1 'inc 3) (send o1 'dec)
  37. (send o2 'inc 3) (send o2 'dec)
  38. (values (send o1 'get) (send o2 'get)))
  39. 2
  40. "**"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement