scheme8.rkt 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #lang racket
  2. (define new-object make-hash)
  3. (define (clone object)
  4. (hash-copy object))
  5. (define-syntax !!
  6. (syntax-rules()
  7. ((_ object msg new-val)
  8. (hash-set! object 'msg new-val))))
  9. (define-syntax ??
  10. (syntax-rules ()
  11. ((_ object msg)
  12. (dispatch object 'msg))))
  13. (define-syntax ->
  14. (syntax-rules ()
  15. ((_ object msg arg ...)
  16. ((dispatch object 'msg) object arg ...))))
  17. (define (son-of parent)
  18. (let ((o (new-object)))
  19. (!! o <<parent>> parent)
  20. o))
  21. (define (dispatch object msg)
  22. (if (eq? object 'unknown)
  23. (error "Unknown message" msg)
  24. (let ((slot (hash-ref object msg 'unknown)))
  25. (if (eq? slot 'unknown)
  26. (dispatch (hash-ref object '<<parent>> 'unknown) msg)
  27. slot))))
  28. (define Pino (new-object))
  29. (!! Pino name "Pino")
  30. (!! Pino hello
  31. (lambda (self x)
  32. (display (?? self name))
  33. (display ": hi, ")
  34. (display (?? x name))
  35. (display "!")
  36. (newline)))
  37. (!! Pino set-name
  38. (lambda (self x)
  39. (!! self name x)))
  40. (!! Pino set-name-&-age
  41. (λ (self n a)
  42. (!! self name n)
  43. (!! self age a)))
  44. (define Pina (clone Pino))
  45. (!! Pina name "Pina")
  46. (-> Pino hello Pina)
  47. (-> Pino set-name "Ugo")
  48. (-> Pina set-name-&-age "Lucia" 25)
  49. (-> Pino hello Pina)
  50. (define Glenn (son-of Pino))
  51. (?? Glenn name)
  52. (!! Glenn name "Glenn")
  53. (!! Glenn age 50)
  54. (-> Glenn hello Pina)