ham-fisted.hlet
Extensible let to allow efficient typed destructuring.
Registered Extensions:
dbls
and lngs
will most efficiently destructure java primitive arrays and fall back to casting the result
of clojure.lang.RT/nth if input is not a double or long array.
dlb-fns
and lng-fns
call the object's IFn interface with no interface checking. This will not work
with a raw array but is the fastest way - faster than RT/nth - to get data out of a persistent-vector or map
like object.
obj-fns
- fast IFn-based destructuring to objects - does not work with object arrays. Often much faster
than RT/nth.
This can significantly reduce boxing in tight loops without needing to result in really verbose pathways.
user> (h/let [[a b] (dbls [1 2])] (+ a b))
3.0
user> (hamf/sum-fast (lznc/cartesian-map
#(h/let [[a b c d](lng-fns %)]
(-> (+ a b) (+ c) (+ d)))
[1 2 3]
[4 5 6]
[7 8 9]
[10 11 12 13 14]))
3645.0
See also ham-fisted.primitive-invoke, ham-fisted.api/dnth ham-fisted.api/lnth.
extend-let
(extend-let sym-name code)
Code gets a tuple of lhs rhs must return a flattened sequence of left and right hand sides. This uses a special symbol that will look like a function call on the right hand side as the dispatch mechanism.
See source code of this file for example extensions.
let
macro
(let bindings & body)
Extensible let intended to allow typed destructuring of arbitrary datatypes such as primitive arrays or point types. Falls back to normal let after extension process. Several extensions are registered by default -
dbls
andlngs
which destructure into primitive doubles and primitive longs, respectively.dlb-fns
andlng-fns
which destructure into primitive doubls and longs but use the often faster IFn overloads to get the data - avoiding RT.nth calls.obj-fns
which destructure into objects using the IFn interface.
user> (h/let [[x y] (dbls (hamf/double-array [1 2]))]
(+ x y))
3.0