/examples/perlin-noise/lib/source.scm

http://github.com/dharmatech/abstracting · Scheme · 242 lines · 119 code · 47 blank · 76 comment · 0 complexity · cd3138030b412fe6abd23da98f42446c MD5 · raw file

  1. ;; Scheme library used for Assignement #1
  2. ;; for the course comp-521
  3. ;;
  4. ;; by David St-Hilaire
  5. ;; winter 2008
  6. ;;
  7. ;;
  8. ;; This library source file contains various well known and less well
  9. ;; known functions used in functionnal programming. Authors referrence
  10. ;; will not be cited but most of the code here was not invented by the
  11. ;; author of this file. Also, these functions will not be documented
  12. ;; because names and uses of these are trivial for any functionnal
  13. ;; programmer.
  14. ; Compiler declarations for optimizations
  15. ;; (declare (standard-bindings)
  16. ;; (extended-bindings)
  17. ;; (block)
  18. ;; (not safe)
  19. ;; (fixnum))
  20. ;;;;;;;;;;;;;;;;;;;;;;; list operations ;;;;;;;;;;;;;;;;;;;;;;;;;;
  21. (define (list-remove comparator el list)
  22. (let loop ((list list)
  23. (acc '()))
  24. (if (not (pair? list))
  25. (reverse acc)
  26. (if (comparator (car list) el)
  27. (loop (cdr list) acc)
  28. (loop (cdr list) (cons (car list) acc))))))
  29. (define (filter pred list)
  30. (cond
  31. ((not (pair? list)) '())
  32. ((pred (car list)) (cons (car list) (filter pred (cdr list))))
  33. (else (filter pred (cdr list)))))
  34. (define (exists pred list)
  35. (let loop ((list list) (acc #f))
  36. (if (not (pair? list))
  37. acc
  38. (loop (cdr list) (or acc (pred (car list)))))))
  39. (define (forall pred list)
  40. (let loop ((list list) (acc #t))
  41. (if (not (pair? list))
  42. acc
  43. (loop (cdr list) (and acc (pred (car list)))))))
  44. (define (fold-l f acc list)
  45. (if (not (pair? list))
  46. acc
  47. (fold-l f (f acc (car list)) (cdr list))))
  48. (define (cleanse lst)
  49. (cond
  50. ((not (pair? lst)) '())
  51. ((null? (car lst)) (cleanse (cdr lst)))
  52. (else (cons (car lst) (cleanse (cdr lst))))))
  53. (define (union l1 l2)
  54. (let loop ((l1 l1) (acc l2))
  55. (if (not (pair? l1))
  56. acc
  57. (if (member (car l1) l2)
  58. (loop (cdr l1) acc)
  59. (loop (cdr l1) (cons (car l1) acc))))))
  60. ;; (define-macro (extremum-fonction comparator opposite-extremum)
  61. ;; (let ((lst-sym (gensym 'lst-sym))
  62. ;; (extremum-sym (gensym 'extremum-sym))
  63. ;; (loop-sym (gensym 'loop-sym)))
  64. ;; `(lambda (,lst-sym)
  65. ;; (let ,loop-sym ((,lst-sym ,lst-sym)
  66. ;; (,extremum-sym ,opposite-extremum))
  67. ;; (cond
  68. ;; ((not (pair? ,lst-sym)) ,extremum-sym)
  69. ;; ((,comparator (car ,lst-sym) ,extremum-sym)
  70. ;; (,loop-sym (cdr ,lst-sym) (car ,lst-sym)))
  71. ;; (else
  72. ;; (,loop-sym (cdr ,lst-sym) ,extremum-sym)))))))
  73. (define-syntax extremum-fonction
  74. (syntax-rules ()
  75. ((extremum-fonction comparator opposite-extremum)
  76. (lambda (lst)
  77. (let loop ((lst lst)
  78. (extremum opposite-extremum))
  79. (cond ((not (pair? lst)) extremum)
  80. ((comparator (car lst) extremum)
  81. (loop (cdr lst) (car lst)))
  82. (else
  83. (loop (cdr lst) extremum))))))))
  84. ;;;;;;;;;;;;;;;;;;;;;;;;;;;; Math stuff ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  85. (define maximum (extremum-fonction > -inf.0))
  86. (define minimum (extremum-fonction < +inf.0))
  87. (define (average sample)
  88. (/ (apply + sample) (length sample)))
  89. (define (variance sample)
  90. (define mean (average sample))
  91. (define N (length sample))
  92. (/ (fold-l (lambda (acc n) (+ (expt (- n mean) 2) acc))
  93. 0
  94. sample)
  95. N))
  96. (define (standard-deviation sample) (sqrt (variance sample)))
  97. (define (complex-conjugate z)
  98. (make-rectangular (real-part z) (- (imag-part z))))
  99. (define pi (* 2 (asin 1)))
  100. ;;;;;;;;;;;;;;;;;;;;;; Boolean operation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  101. ;; (define-macro (xor b1 b2) `(not (eq? ,b1 ,b2)))
  102. (define-syntax xor
  103. (syntax-rules ()
  104. ((xor b1 b2)
  105. (not (eq? b1 b2)))))
  106. ;;;;;;;;;;;;;;;;;;;;;;;; Simple macros ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  107. ;; (define-macro (for var init-val condition true . false)
  108. ;; (let ((loop (gensym)))
  109. ;; `(let ,loop ((,var ,init-val))
  110. ;; (if ,condition
  111. ;; (begin ,true (,loop (+ ,var 1)))
  112. ;; ,(if (not (null? false))
  113. ;; false)))))
  114. (define-syntax for
  115. (syntax-rules ()
  116. ((for var init-val condition true false)
  117. (let loop ((var init-val))
  118. (if condition
  119. (begin
  120. true
  121. (loop (+ var 1)))
  122. (begin
  123. false))))
  124. ((for var init-val condition true)
  125. (for var init-val condition true #f))
  126. ))
  127. ;; (define-macro (make-vector2d height width . init-val)
  128. ;; (let ((vector-sym (gensym))
  129. ;; (row-sym (gensym)))
  130. ;; `(let ((,vector-sym (make-vector ,height #f)))
  131. ;; (for ,row-sym 0 (< ,row-sym ,height)
  132. ;; (vector-set! ,vector-sym ,row-sym
  133. ;; (make-vector ,width ,(if (pair? init-val)
  134. ;; (car init-val)
  135. ;; #f))))
  136. ;; ,vector-sym)))
  137. (define-syntax make-vector2d
  138. (syntax-rules ()
  139. ((make-vector2d height width init-val)
  140. (let ((vector (make-vector height #f)))
  141. (for row 0 (< row height)
  142. (vector-set! vector row
  143. (make-vector width init-val)))
  144. vector))
  145. ((make-vector-2d height width)
  146. (make-vector-2d height width #f))
  147. ))
  148. ;; (define-macro (vector2d-ref vector row col)
  149. ;; `(vector-ref (vector-ref ,vector ,row) ,col))
  150. (define-syntax vector2d-ref
  151. (syntax-rules ()
  152. ((vector2d-ref vector row col)
  153. (vector-ref (vector-ref vector row) col))))
  154. ;; (define-macro (vector2d-set! vector row col val)
  155. ;; `(vector-set! (vector-ref ,vector ,row) ,col ,val))
  156. (define-syntax vector2d-set!
  157. (syntax-rules ()
  158. ((vector2d-set! vector row col val)
  159. (vector-set! (vector-ref vector row) col val))))
  160. ;; (define-macro (make-vector3d i-length j-length k-length . init-val)
  161. ;; (let ((vector-sym (gensym))
  162. ;; (i-sym (gensym))
  163. ;; (j-sym (gensym)))
  164. ;; `(let ((,vector-sym (make-vector2d ,i-length ,j-length #f)))
  165. ;; (for ,i-sym 0 (< ,i-sym ,i-length)
  166. ;; (for ,j-sym 0 (< ,j-sym ,j-length)
  167. ;; (vector2d-set! ,vector-sym ,i-sym ,j-sym
  168. ;; (make-vector ,k-length ,(if (pair? init-val)
  169. ;; (car init-val)
  170. ;; #f)))))
  171. ;; ,vector-sym)))
  172. (define-syntax make-vector3d
  173. (syntax-rules ()
  174. ((make-vector3d i-length j-length k-length init-val)
  175. (let ((vector (make-vector2d i-length j-length #f)))
  176. (for i 0 (< i i-length)
  177. (for j 0 (< j j-length)
  178. (vector2d-set! vector i j (make-vector k-length init-val))))
  179. vector))
  180. ((make-vector3d i-length j-length k-length)
  181. (make-vector3d i-length j-length k-length #f))))
  182. ;; (define-macro (vector3d-ref vector i j k)
  183. ;; `(vector-ref (vector2d-ref ,vector ,i ,j) ,k))
  184. (define-syntax vector3d-ref
  185. (syntax-rules ()
  186. ((vector3d-ref vector i j k)
  187. (vector-ref (vector2d-ref vector i j) k))))
  188. ;; (define-macro (vector3d-set! vector i j k val)
  189. ;; `(vector-set! (vector2d-ref ,vector ,i ,j) ,k ,val))
  190. (define-syntax vector3d-set!
  191. (syntax-rules ()
  192. ((vector3d-set! vector i j k val)
  193. (vector-set! (vector2d-ref vector i j) k val))))
  194. ; Randomize current mrg's seed
  195. ;; (random-source-randomize! default-random-source)