Create a direct access array
This commit is contained in:
parent
99ae99a8ab
commit
3e24991be8
|
@ -1,11 +1,37 @@
|
|||
(defmacro array (size)
|
||||
`(let ,(map (lambda (x) (list (fuse 'index x))) (create-indices size))
|
||||
(dlambda
|
||||
(:get (i) (eval (fuse 'index i)))
|
||||
(:set (i value) (set (fuse 'index i) value)))))
|
||||
(defmacro array (length)
|
||||
(let* ((this (gensym))
|
||||
(index-prefix (fuse this 'index))
|
||||
(indices (create-indices length))
|
||||
(index-bindings (map (lambda (i) (list (fuse index-prefix i))) indices)))
|
||||
|
||||
(defun create-indices (size)
|
||||
(create-indices-tail (- size 1) ()))
|
||||
`(let ,index-bindings
|
||||
(setq ,this
|
||||
(dlambda
|
||||
(:get (i)
|
||||
(eval (fuse ',index-prefix i)))
|
||||
|
||||
(:set (i value)
|
||||
(if (< i ,length)
|
||||
(set (fuse ',index-prefix i) value)))
|
||||
|
||||
(:length ()
|
||||
,length)
|
||||
|
||||
(t ()
|
||||
((lambda (indices accumulator)
|
||||
(if (null? indices)
|
||||
accumulator
|
||||
(recur
|
||||
(rest indices)
|
||||
(cons
|
||||
(list (first indices) (call ,this :get (first indices)))
|
||||
accumulator))))
|
||||
(reverse ',indices)
|
||||
nil)))))))
|
||||
|
||||
|
||||
(defun create-indices (length)
|
||||
(create-indices-tail (- length 1) ()))
|
||||
|
||||
(defun create-indices-tail (index accumulator)
|
||||
(if (< index 0)
|
||||
|
|
Loading…
Reference in New Issue