scheme7.rkt 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. #lang racket
  2. (struct being (
  3. name
  4. (age #:mutable)
  5. ))
  6. (define (being-show x)
  7. (display (being-name x))
  8. (display " (")
  9. (display (being-age x))
  10. (display ")"))
  11. (define (say-hello x)
  12. (if (being? x)
  13. (begin
  14. (being-show x)
  15. (display ": my regards.")
  16. (newline))
  17. (error "not a being")))
  18. (define andrea (being "andrea" 23))
  19. (say-hello andrea)
  20. (set-being-age! andrea 24)
  21. (say-hello andrea)
  22. (struct may-being being
  23. ((alive? #:mutable))
  24. )
  25. (define (kill! x)
  26. (if (may-being? x)
  27. (set-may-being-alive?! x #f)
  28. (error "not a may-being")))
  29. (define andrea-son (may-being "andrea-son" 23 #t))
  30. (say-hello andrea-son)
  31. (may-being? andrea)
  32. (may-being? andrea-son)
  33. (being? andrea-son)
  34. (kill! andrea-son)
  35. (say-hello andrea-son)
  36. (define (try-to-say-hello x)
  37. (if (and
  38. (may-being? x)
  39. (not (may-being-alive? x)))
  40. (begin
  41. (display "I hear only silence")
  42. (newline))
  43. (say-hello x)))
  44. (try-to-say-hello andrea)
  45. (try-to-say-hello andrea-son)
  46. (define (make-simple-object)
  47. (let ((my-var 0))
  48. (define (init)
  49. (set! my-var 0)
  50. my-var)
  51. (define (my-add x)
  52. (set! my-var (+ my-var x))
  53. my-var)
  54. (define (get-my-var)
  55. my-var)
  56. (define (my-display)
  57. (newline)
  58. (display "my Var is:")
  59. (display my-var)
  60. (newline))
  61. (lambda (message . args)
  62. (apply (case message
  63. ((init) init)
  64. ((my-add) my-add)
  65. ((my-display) my-display)
  66. ((get-my-var) get-my-var)
  67. (else (error "Unknown method!")))
  68. args))))
  69. (define obj1 (make-simple-object))
  70. (obj1 'init)
  71. (obj1 'my-add 3)
  72. (define (make-son)
  73. (let ((parent (make-simple-object))
  74. (name "an object"))
  75. (define (init)
  76. (parent 'init))
  77. (define (hello)
  78. "hi!")
  79. (define (my-display)
  80. (display "My name is ")
  81. (display name)
  82. (display " and")
  83. (parent 'my-display))
  84. (lambda (message . args)
  85. (case message
  86. ((init) (apply init args))
  87. ((my-display) (apply my-display args))
  88. ((hello) (apply hello args))
  89. (else (apply parent (cons message args)))))))
  90. (define obj2 (make-son))
  91. (obj2 'init)
  92. (obj2 'my-display)
  93. (obj2 'hello)
  94. (define new-object make-hash)
  95. (define (clone object)
  96. (hash-copy object))
  97. (define-syntax !!
  98. (syntax-rules ()
  99. ((_ object msg new-val)
  100. (hash-set! object 'msg new-val))))
  101. (define-syntax ??
  102. (syntax-rules ()
  103. ((_ object msg)
  104. (hash-ref object 'msg))))
  105. (define-syntax ->
  106. (syntax-rules ()
  107. ((_ object msg arg ...)
  108. ((hash-ref object 'msg) object arg ...))))
  109. (define Pino (new-object))
  110. (!! Pino name "Pino")
  111. (!! Pino hello
  112. (lambda (self x)
  113. (display (?? self name))
  114. (display ": hi, ")
  115. (display (?? x name))
  116. (display "!")
  117. (newline)))
  118. (!! Pino set-name
  119. (lambda (self x)
  120. (!! self name x)))
  121. (!! Pino set-name-&-age
  122. (λ (self n a)
  123. (!! self name n)
  124. (!! self age a)))
  125. (define Pina (clone Pino))
  126. (!! Pina name "Pina")
  127. (-> Pino hello Pina)
  128. (-> Pino set-name "Ugo")
  129. (-> Pina set-name-&-age "Lucia" 25)
  130. (-> Pino hello Pina)