scheme-libraries/retropikzel/vector-keys.scm

50 lines
1.3 KiB
Scheme

;;>\pre{
;;> vector-keys - Utilities to accessing vector indexes
;;>
;;> Macros that make it easy to access vector indexes using "keys".
;;>
;;>}
;;>\section{Usage}
;;>\pre{
;;> (define player (make-vector 10 0))
;;> (vector-keys player
;;> (player.x 0)
;;> (player.y 1))
;;>
;;> (player.x) ;; Returns 0
;;> (player.x 10)
;;> (player.x) ;; Returns 10
;;>
;;> (let ((enemy (make-vector 10 0)))
;;> (let-vector-keys enemy
;;> ((enemy.x 0)
;;> (enemy.y 1))
;;> (enemy.x) ;; Returns 0
;;> (enemy.x 100)
;;> (enemy.x) ;; Returns 100
;;> ))
;;>}
;;>\section{Reference}
;;> Define set of keys to access vector indexes
(define-syntax vector-keys
(syntax-rules ()
((_ vec (key index) ...)
(begin
(define-syntax key
(syntax-rules ()
((_) (vector-ref vec index))
((_ new-value) (vector-set! vec index new-value))))
...))))
;;> Define set of keys to access vector indexes inside let body
(define-syntax let-vector-keys
(syntax-rules ()
((_ vec ((key index) ...) body ...)
(let-syntax ((key (syntax-rules ()
((_) (vector-ref vec index))
((_ new-value) (vector-set! vec index new-value))))
...)
body ...))))