diff options
author | Leah Neukirchen <leah@vuxu.org> | 2022-11-26 18:16:38 +0100 |
---|---|---|
committer | Leah Neukirchen <leah@vuxu.org> | 2022-11-26 18:16:38 +0100 |
commit | 9376d7131a9f2a8df55a556110304bd9a2e39c40 (patch) | |
tree | f4598ed4a6c49177145e9018d678863094e7180c | |
parent | 2a0f96114fb75ecf6975812a041e96f7b9d161c5 (diff) | |
download | mew-9376d7131a9f2a8df55a556110304bd9a2e39c40.tar.gz mew-9376d7131a9f2a8df55a556110304bd9a2e39c40.tar.xz mew-9376d7131a9f2a8df55a556110304bd9a2e39c40.zip |
add sample
-rw-r--r-- | mew.scm | 14 | ||||
-rw-r--r-- | mew.svnwiki | 5 | ||||
-rw-r--r-- | tests/test.mew | 5 |
3 files changed, 23 insertions, 1 deletions
diff --git a/mew.scm b/mew.scm index c5f1f31..caed21a 100644 --- a/mew.scm +++ b/mew.scm @@ -17,7 +17,7 @@ odometer one-of op op* per prn proj puts rand range rep - scan scan-right sing? search seq set set-at shuffle str slurp + sample scan scan-right sing? search seq set set-at shuffle str slurp tally-accumulator tbl time while uniq-accumulator unlist until @@ -412,6 +412,18 @@ (loop (dec i))))) v) + (define (sample o) + (if (hash-table? o) + (esc ret + (let ((n (rand (hash-table-size o))) + (i 0)) + (hash-table-for-each o + (lambda (k v) + (if (= i n) + (ret (cons k v)) + (set! i (inc i))))))) + (get o (rand (len o))))) + (define range (case-lambda (() (make-range-generator 0 +inf.0 1)) diff --git a/mew.svnwiki b/mew.svnwiki index 6898888..6509423 100644 --- a/mew.svnwiki +++ b/mew.svnwiki @@ -527,6 +527,11 @@ Returns a random integer such that N <= {{(rand <M>)}} < {{<M>}}. Shuffles the vector {{<vector>}} randomly in-place using a Fisher-Yates shuffle. +<procedure>(sample <obj>)</procedure> + +Returns a random element of the list/vector/string {{<obj>}}. +Returns a random key/value pair of the hash-table {{<obj>}}. + == Special syntax diff --git a/tests/test.mew b/tests/test.mew index cf84c97..e697751 100644 --- a/tests/test.mew +++ b/tests/test.mew @@ -35,6 +35,11 @@ (test #f (=? (shuffle #(1 2 3 4 5 6 7 8 9 0)) (shuffle #(1 2 3 4 5 6 7 8 9 0))))) +(test-group "sample" + (test #t ((one-of 1 2 3) (sample '(1 2 3)))) + (test #t ((one-of 1 2 3) (sample #(1 2 3)))) + (test #t ((one-of '(1 . 2) '(3 . 4)) (sample (tbl 1 2 3 4))))) + (test-group "range" (test '(1 2 3) (into '() (range 1 4))) (test '() (into '() (range 4 1))) |