diff --git a/src/compiler/boot.dst b/src/compiler/boot.dst index 5a810452..151e4ea2 100644 --- a/src/compiler/boot.dst +++ b/src/compiler/boot.dst @@ -266,6 +266,11 @@ evaluates to true." fal)))))) (aux 0)) +(defmacro default + "Suplies a default argument when a value is nil." + [sym default-value] + (tuple 'def sym (tuple 'or sym default-value))) + (defmacro when-let "Takes the first one or two forms in vector and if true binds all the forms with let and evaluates the body" @@ -298,10 +303,48 @@ evaluates to true." ### ### -### Indexed Conbinators +### Indexed Combinators ### ### +(def sort + "Sort an array in-place. Uses quicksort and is not a stable sort." + (do + + (defn partition + [a lo hi by] + (def pivot (get a hi)) + (var i lo) + (for [j lo hi] + (def aj (get a j)) + (when (by aj pivot) + (def ai (get a i)) + (put a i aj) + (put a j ai) + (++ i))) + (put a hi (get a i)) + (put a i pivot) + i) + + (defn sort-help + [a lo hi by] + (when (> hi lo) + (def piv (partition a lo hi by)) + (sort-help a lo (- piv 1) by) + (sort-help a (+ piv 1) hi by)) + a) + + (fn [a by] + (sort-help a 0 (- (length a) 1) (or by order<))))) + +(defn sorted + "Returns the sorted version of an indexed data structure." + [ind by] + (def sa (sort (apply1 array ind) by)) + (if (= :tuple (type ind)) + (apply1 tuple sa) + sa)) + (defn reduce "Reduce, also know as foldleft in many languages, transform an indexed type (array, tuple) with a function to produce a value."