Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;; Very ugly port of https://github.com/guicho271828/life10-benchmarks/blob/master/life.ros
- (import (rnrs bytevectors))
- ;;; life.scm -- Conway's Game of Life in Scheme (at least R5RS and later)
- ;; this let was not needed
- (let ((n 40)
- (m 80)
- (g 66000))
- (define-syntax dotimes
- (syntax-rules ()
- ((_ (start goal) body ...)
- (let loop ((start 0))
- (when (< start goal)
- body ...
- (loop (+ start 1)))))))
- (define-syntax aref*
- (syntax-rules ()
- ((_ a i j)
- (bytevector-u8-ref a (+ (* i m) j)))))
- (define-syntax aset!
- (syntax-rules ()
- ((_ a i j v)
- (bytevector-u8-set! a (+ (* i m) j) v))))
- (define (display-it b)
- (dotimes (i n)
- (dotimes (j m)
- (if (eq? 0 (aref* b i j))
- (display #\space)
- (display #\*)))
- (newline)))
- (define (main)
- (let ((b (make-bytevector (* n m)))
- (nextb (make-bytevector (* n m))))
- (aset! b 19 41 1)
- (aset! b 20 40 1)
- (aset! b 21 40 1)
- (aset! b 22 40 1)
- (aset! b 22 41 1)
- (aset! b 22 42 1)
- (aset! b 22 43 1)
- (aset! b 19 44 1)
- (display "Before:")
- (display-it b)
- (let loop ((k 0)
- (b b)
- (nextb nextb))
- (when (< k g)
- (dotimes (i n)
- (let* ((nm1 (1- n))
- (up (if (not (eq? i 0))
- (1- i)
- nm1))
- (upm (* up m))
- (down (if (not (eq? i nm1))
- (1+ i)
- 0))
- (downm (* down m))
- (im (* i m)))
- (dotimes (j m)
- (let* ((mm1 (1- m))
- (left (if (not (eq? j 0))
- (1- j)
- mm1))
- (right (if (not (eq? j mm1))
- (1+ j)
- 0))
- (count
- (+ (bytevector-u8-ref b (+ upm left))
- (bytevector-u8-ref b (+ upm j))
- (bytevector-u8-ref b (+ upm right))
- (bytevector-u8-ref b (+ im right))
- (bytevector-u8-ref b (+ downm right))
- (bytevector-u8-ref b (+ downm j))
- (bytevector-u8-ref b (+ downm left))
- (bytevector-u8-ref b (+ im left)))))
- (aset! nextb i j
- (cond
- ((eq? count 2) (aref* b i j))
- ((eq? count 3) 1)
- (else 0)))))))
- (loop (1+ k) nextb b)))
- (display "After ") (display g) (display " generations:") (newline)
- (display-it b)))
- (main)
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement