# HG changeset patch # User Steve Losh # Date 1486470365 0 # Node ID 29f67f70f4b41bed1cc75b32faa631299b1f617c # Parent 5f26482784a660a1d9ab1c83270e8abd1ba6864f Add `collect-hash` diff -r 5f26482784a6 -r 29f67f70f4b4 losh.lisp --- a/losh.lisp Mon Feb 06 14:36:36 2017 +0000 +++ b/losh.lisp Tue Feb 07 12:26:05 2017 +0000 @@ -1457,6 +1457,34 @@ ,form))))))) +(defmacro-clause (COLLECT-HASH key-and-value &optional + INTO var + TEST (test #'eql)) + "Collect keys and values into a hash table at `var`. + + `key-and-value` should be a `(key-expr . value-expr)` pair. + + If `var` is omitted the hash table will be returned instead. + + `test` specifies the test used for the hash table. + + Example: + + (iterate (for x :from 0) + (for y :in '(a b c)) + (collect-hash ((1+ x) . y))) + ; => {1 a + ; 2 b + ; 3 c} + + " + (destructuring-bind (key . value) key-and-value + (let ((hash-table (or var iterate::*result-var*))) + `(progn + (with ,hash-table = (make-hash-table :test ,test)) + (setf (gethash ,key ,hash-table) ,value))))) + + (defun keywordize-clause (clause) (iterate (for (k v . nil) :on clause :by #'cddr) @@ -1506,6 +1534,7 @@ (keywordize-clause clause)))))) + ;;;; Hash Tables -------------------------------------------------------------- (defun mutate-hash-values (function hash-table) "Replace each value in `hash-table` with the result of calling `function` on it. @@ -1883,6 +1912,10 @@ (terpri stream) (values)) +(defun pht (hash-table &optional (stream t)) + "Synonym for `print-hash-table` for less typing at the REPL." + (print-hash-table hash-table stream)) + (defun print-hash-table-concisely (hash-table &optional (stream t)) "Print a concise representation of `hash-table` to `stream.` diff -r 5f26482784a6 -r 29f67f70f4b4 package.lisp --- a/package.lisp Mon Feb 06 14:36:36 2017 +0000 +++ b/package.lisp Tue Feb 07 12:26:05 2017 +0000 @@ -80,7 +80,8 @@ #+sbcl :stop-profiling :print-table :print-hash-table - :print-concisely)) + :print-hash-table-concisely + :pht)) (defpackage :losh.eldritch-horrors (:documentation "Abandon all hope, ye who enter here.") @@ -144,8 +145,10 @@ (:use :iterate) ; need this for iterate's `for` symbol fuckery (:documentation "Custom `iterate` drivers and clauses.") (:export + :across-flat-array :averaging + :collect-hash :cycling :every-nth :for-nested @@ -163,8 +166,10 @@ :run-time :since-start-into :skip-origin + :test :timing :within-radius + )) (defpackage :losh.licensing