scheme3.rkt 3.1 KB

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