Metadata
(require meta) | package: meta |
This package provides a mechanism for associating arbitrary metadata with values. It’s inspired by Clojure’s metadata. Attaching metadata to a value does not affect equal? or chaperone-of? comparisons, but it may affect eq? comparisons. The following datatypes don’t support metadata: booleans, strings, byte strings, numbers, characters, symbols, keywords, mutable pairs and lists, void, undefined, opaque structures.
Under the hood, it uses Impersonator Properties to store metadata for datatypes that support chaperones. For others, it copies the value and uses a weak mutable hash table (compared with eq?) to store metadata behind the scenes.
procedure
v : any/c key : any/c
failure-result : failure-result/c =
(lambda () (raise (make-exn:fail:contract ....)))
procedure
(meta-has-key? v key) → boolean?
v : any/c key : any/c
> (define v (meta-set (cons 1 2) 'key "value")) > (meta-has-key? v 'key) #t
procedure
(meta-update v key updater [failure-result]) → meta?
v : meta? key : any/c updater : (-> any/c any/c)
failure-result : failure-result/c =
(lambda () (raise (make-exn:fail:contract ....)))
> (define b (meta-update (box 2) 'key add1 1)) > (meta-ref b 'key) 2
procedure
(meta-remove v key) → any/c
v : any/c key : any/c
> (define v (meta-set (vector) 'key "value")) > (meta-has-key? (meta-remove v 'key) 'key) #f