Generic Accessors and Mutators

The :std/ref library provides generic accessors and mutators interface and can be used to access/mutate existing types as well as ones defined by user.

To use the bindings from this module:

(import :std/ref)

ref

(ref obj n)           -> any
(ref obj n1 n2 ... n) -> any

Returns element in the position n from obj. If obj is hash-table, returns the value associated with key n. If multiple args provided, (ref obj n1 n2 ... n) expands to (ref ... (ref (ref obj n1) n2) ... n).

Examples:

> (def lst [[10 20 30]
           #(40 50 60)])
> (ref lst 1 0)
40

> (import :std/sugar)
> (def lst [(hash (a 10) (b 20))])
> (ref lst 0 'b)
20

~

(~ obj n)           -> any
(~ obj n1 n2 ... n) -> any

Alias for ref.

ref-set!

(ref-set! obj n val)           -> void
(ref-set! obj n1 n2 ... n val) -> void
(set! (ref obj n ...) val)     -> void

Puts element val at the position n in obj. If obj is hash, associates val with key n. If multiple args provided, (ref-set! obj n1 n2 ... nk val) expands to (ref-set! (ref ... (ref obj n1) n2) ... nk-1) nk val).

Also, ref-set! can be used with set! mutator as well.

Examples:

> (def lst [[10 20 30]
           #(40 50 60)])
> (ref-set! lst 1 0 "hi")
> lst
((10 20 30) #("hi" 50 60))

~-set!

(~-set! obj n val)           -> void
(~-set! obj n1 n2 ... n val) -> void
(set! (~ obj n ...) val)     -> void

Alias for ref-set!.

:ref

(defmethod (:ref (obj <type>) (n <type>))
  (body ...))

Generic ref interface, can be used to add work with user-defined types.

:set!

(defmethod (:set! (obj <type>) (n <type>) (val <type>))
  (body ...))

Generic ref-set! interface, can be used to add work with user-defined types.