50 lines
1.3 KiB
Scheme
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 ...))))
|
|
|