vector-keys: Made this

This commit is contained in:
retropikzel 2026-08-22 18:11:50 +03:00
parent 4f71f50312
commit 890c7d4886
6 changed files with 93 additions and 0 deletions

View File

@ -0,0 +1,49 @@
;;>\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 ...))))

View File

@ -0,0 +1,6 @@
(define-library
(retropikzel vector-keys)
(import (scheme base))
(export vector-keys
let-vector-keys)
(include "vector-keys.scm"))

View File

@ -0,0 +1 @@
Utilities to accessing vector indexes

View File

@ -0,0 +1 @@
LGPL-3.0-or-later

View File

@ -0,0 +1 @@
1.0.0

View File

@ -0,0 +1,35 @@
(import (scheme base)
(scheme write)
(retropikzel tap)
(retropikzel vector-keys)
(srfi 64))
(test-runner-current (tap-runner))
(test-begin "vector-keys")
(test-begin "vector-keys")
(define player (make-vector 10 0))
(vector-keys player
(player.x 0)
(player.y 1))
(test-equal 0 (player.x))
(player.x 10)
(test-equal 10 (player.x))
(test-end "vector-keys")
(test-begin "let-vector-keys")
(let ((enemy (make-vector 10 0)))
(let-vector-keys enemy
((enemy.x 0)
(enemy.y 1))
(enemy.x 100)
(test-equal 100 (enemy.x))))
(test-end "let-vector-keys")
(test-end "vector-keys")