Advertisement
trannus_aran

r7rs-small-library-example

Apr 15th, 2025
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Scheme 3.38 KB | None | 0 0
  1. (define-library (example grid)
  2.                 (export make rows cols ref each)
  3.                 (import (scheme base))
  4.                 (begin
  5.                   ;; Create an NxM grid.
  6.                   (define (make n m)
  7.                     (let ((grid (make-vector n)))
  8.                       (do ((i 0 (+ i 1)))
  9.                         ((= i n) grid)
  10.                         (let ((v (make-vector m #false)))
  11.                           (vector-set! grid i v)))))
  12.                   (define (rows grid)
  13.                     (vector-length grid))
  14.                   (define (cols grid)
  15.                     (vector-length (vector-ref grid 0)))
  16.                   ;; Return #false if out of range.
  17.                   (define (ref grid n m)
  18.                     (and (< -1 n (rows grid))
  19.                          (< -1 m (cols grid))
  20.                          (vector-ref (vector-ref grid n) m)))
  21.                   (define (grid-put! grid n m v)
  22.                     (vector-set! (vector-ref grid n) m v))
  23.                   (define (each grid proc)
  24.                     (do ((j 0 (+ j 1)))
  25.                       ((= j (rows grid)))
  26.                       (do ((k 0 (+ k 1)))
  27.                         ((= k (cols grid)))
  28.                         (proc j k (ref grid j k)))))))
  29.  
  30. (define-library (example life)
  31.                 (export life)
  32.                 (import (scheme write)
  33.                         (example grid))
  34.                 (begin
  35.                   (define (life-count grid i j)
  36.                     (define (count i j)
  37.                       (if (ref grid i j) 1 0))
  38.                     (+ (count (- i 1) (- j 1))
  39.                        (count (- i 1) j)
  40.                        (count (- i 1) (+ j 1))
  41.                        (count i (- j 1))
  42.                        (count i (+ j 1))
  43.                        (count (+ i 1) (- j 1))
  44.                        (count (+ i 1) j)
  45.                        (count (+ i 1) (+ j 1))))
  46.                   (define (life-alive? grid i j)
  47.                     (case (life-count grid i j)
  48.                       ((3) #true)
  49.                       ((2) (ref grid i j))
  50.                       (else #false)))
  51.                   (define (life-print grid)
  52.                     (display "\x1B;[1H\x1B;[J") ; clear vt100
  53.                     (each grid
  54.                           (lambda (i j v)
  55.                             (display (if v "*" " "))
  56.                             (when (= j (- (cols grid) 1))
  57.                               (newline)))))
  58.                   (define (life grid iterations)
  59.                     (do ((i 0 (+ i 1))
  60.                          (grid0 grid grid1)
  61.                          (grid1 (make (rows grid) (cols grid))
  62.                                 grid0))
  63.                       ((= i iterations))
  64.                       (each grid0
  65.                             (lambda (j k v)
  66.                               (let ((a (life-alive? grid0 j k)))
  67.                                 (grid-put! grid1 j k a))))
  68.                       (life-print grid1)))))
  69.  
  70. ;; Main program.
  71. (import (scheme base)
  72.         (only (example life) life)
  73.         (rename (prefix (example grid) grid-)
  74.                 (grid-make make-grid)))
  75. ;; Initialize a grid with a glider.
  76. (define grid (make-grid 24 24))
  77. (grid-set! grid 1 1 #true)
  78. (grid-set! grid 2 2 #true)
  79. (grid-set! grid 3 0 #true)
  80. (grid-set! grid 3 1 #true)
  81. (grid-set! grid 3 2 #true)
  82. ;; Run for 80 iterations.
  83. (life grid 80)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement