Guest User

Untitled

a guest
Feb 18th, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.71 KB | None | 0 0
  1.  
  2. (define list-fold-left fold-left)
  3.  
  4. (define (list-for-each-with-index proc ls)
  5. (list-fold-left (lambda (i elt)
  6. (proc i elt)
  7. (+ i 1))
  8. 0
  9. ls))
  10.  
  11. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  12.  
  13. (define size vector-length)
  14.  
  15. (define ref vector-ref)
  16.  
  17. (define put! vector-set!)
  18.  
  19. (define new-of-size make-vector)
  20.  
  21. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  22.  
  23. (define-syntax fold-left
  24. (lambda (stx)
  25. (syntax-case stx ()
  26. ((fold-left ?proc ?init ?seq ?rest ...)
  27. (with-syntax (((rest ...) (generate-temporaries #'(?rest ...))))
  28. #'(let ((proc ?proc) (init ?init) (seq ?seq) (rest ?rest) ...)
  29. (let ((n (size seq)))
  30. (let loop ((i 0) (val init))
  31. (if (>= i n)
  32. val
  33. (loop (+ i 1)
  34. (proc val
  35. (ref seq i)
  36. (ref rest i)
  37. ...))))) ))))))
  38.  
  39. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  40.  
  41. (define-syntax for-each
  42. (lambda (stx)
  43. (syntax-case stx ()
  44. ((for-each ?proc ?seq ?rest ...)
  45. (with-syntax (((param ...) (generate-temporaries #'(?seq ?rest ...)))
  46. ((rest ...) (generate-temporaries #'(?rest ...))))
  47. #'(let ((proc ?proc) (seq ?seq) (rest ?rest) ...)
  48. (fold-left (lambda (val param ...)
  49. (proc param ...))
  50. #f
  51. seq
  52. rest
  53. ...)))))))
  54.  
  55. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  56.  
  57. (define-syntax for-each-with-index
  58. (lambda (stx)
  59. (syntax-case stx ()
  60. ((for-each-with-index ?proc ?seq ?rest ...)
  61. (with-syntax (((param ...) (generate-temporaries #'(?seq ?rest ...)))
  62. ((rest ...) (generate-temporaries #'(?rest ...))))
  63. #'(let ((proc ?proc) (seq ?seq) (rest ?rest) ...)
  64. (fold-left (lambda (i param ...)
  65. (proc i param ...)
  66. (+ i 1))
  67. 0
  68. seq
  69. rest
  70. ...)))))))
  71.  
  72. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  73.  
  74. (define (copy seq)
  75. (let ((new (new-of-size (size seq))))
  76. (for-each-with-index (lambda (i elt)
  77. (put! new i elt))
  78. seq)
  79. new))
  80.  
  81. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  82.  
  83. (define (from-reverse-list ls n)
  84. (let ((seq (new-of-size n)))
  85. (list-for-each-with-index (lambda (i elt)
  86. (put! seq (- (- n 1) i) elt))
  87. ls)
  88. seq))
  89.  
  90. (define-syntax map-to-reverse-list
  91. (lambda (stx)
  92. (syntax-case stx ()
  93. ((map-to-reverse-list ?proc ?seq ?rest ...)
  94. (with-syntax (((elt ...) (generate-temporaries #'(?seq ?rest ...)))
  95. ((rest ...) (generate-temporaries #'(?rest ...))))
  96. #'(let ((proc ?proc)
  97. (seq ?seq)
  98. (rest ?rest)
  99. ...)
  100. (fold-left (lambda (ls elt ...)
  101. (cons (proc elt ...) ls))
  102. '()
  103. seq
  104. rest
  105. ...)))))))
  106.  
  107. (define-syntax map
  108. (lambda (stx)
  109. (syntax-case stx ()
  110. ((map ?proc ?seq ?rest ...)
  111. (with-syntax (((rest ...) (generate-temporaries #'(?rest ...))))
  112. #'(let ((proc ?proc)
  113. (seq ?seq)
  114. (rest ?rest)
  115. ...)
  116. (from-reverse-list (map-to-reverse-list proc seq rest ...)
  117. (size seq))))))))
  118.  
  119. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  120.  
  121. (assert
  122. (equal?
  123. (fold-left (lambda (ls a)
  124. (cons (list a) ls))
  125. '()
  126. '#(1 2 3))
  127. '((3) (2) (1))))
  128.  
  129. (assert
  130. (equal?
  131. (fold-left (lambda (ls a b)
  132. (cons (list a b) ls))
  133. '()
  134. '#(1 2 3)
  135. '#(4 5 6))
  136. '((3 6) (2 5) (1 4))))
  137.  
  138. (assert
  139. (equal?
  140. (fold-left (lambda (ls a b c)
  141. (cons (list a b c) ls))
  142. '()
  143. '#(1 2 3)
  144. '#(4 5 6)
  145. '#(7 8 9))
  146. '((3 6 9) (2 5 8) (1 4 7))))
  147.  
  148. (assert
  149. (null?
  150. (let ((elts '(10 20 30)))
  151. (for-each (lambda (elt)
  152. (set! elts (remove elt elts)))
  153. '#(10 20 30))
  154. elts)))
  155.  
  156. (assert
  157. (null?
  158. (let ((elts '((1 4) (2 5) (3 6))))
  159. (for-each (lambda (a b)
  160. (set! elts (remove (list a b) elts)))
  161. '#(1 2 3)
  162. '#(4 5 6))
  163. elts)))
  164.  
  165. ;; (for-each-with-index (lambda (i a) (display (list i a)) (newline))
  166. ;; '#(10 20 30))
  167.  
  168. ;; (for-each-with-index (lambda (i a b) (display (list i a b)) (newline))
  169. ;; '#(10 20 30)
  170. ;; '#(40 50 60))
  171.  
  172. ;; (for-each-with-index (lambda (i a b c) (display (list i a b c)) (newline))
  173. ;; '#(10 20 30)
  174. ;; '#(40 50 60)
  175. ;; '#(70 80 90))
  176.  
  177. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  178.  
  179. (let ((a '#(10 20 30)))
  180. (let ((b (copy a)))
  181. (assert (equal? a b))
  182. (vector-set! a 0 100)
  183. (assert (not (equal? a b)))
  184. (list a b)))
  185.  
  186.  
  187. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  188.  
  189. (assert
  190. (equal?
  191. (map sqrt '#(4 9 16))
  192. '#(2 3 4)))
  193.  
  194. (assert
  195. (equal?
  196. (map list
  197. '#(a b c)
  198. '#(d e f))
  199. '#((a d) (b e) (c f))))
  200.  
  201. (assert
  202. (equal?
  203. (map list
  204. '#(a b c)
  205. '#(d e f)
  206. '#(g h i))
  207. '#((a d g) (b e h) (c f i))))
Add Comment
Please, Sign In to add comment