diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-05-14 19:02:41 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-05-14 19:02:41 +0000 |
commit | bb881f6a8a89edf08e798316bfb293a18118d4d6 (patch) | |
tree | c06478a0bc46c510fca58c6347024e21a9907e31 /src | |
parent | f0562071873fbd9f8654bbb6663ad8a1a34e0c65 (diff) |
added parallel.clj, fork/join support - in progress
Diffstat (limited to 'src')
-rw-r--r-- | src/genclass.clj | 12 | ||||
-rw-r--r-- | src/parallel.clj | 72 |
2 files changed, 83 insertions, 1 deletions
diff --git a/src/genclass.clj b/src/genclass.clj index 8912fb26..f7188296 100644 --- a/src/genclass.clj +++ b/src/genclass.clj @@ -404,7 +404,11 @@ (defn gen-and-load-class "Generates and immediately loads the bytecode for the specified - class. See gen-class for a description of the options" + class. Note that a class generated this way can be loaded only once + - the JVM supports only one class with a given name per + classloader. Subsequent to generation you can import it into any + desired namespaces just like any other class. See gen-class for a + description of the options." [name & options] (let [{:keys [name bytecode]} @@ -474,5 +478,11 @@ (in-ns 'org.clojure.MyComparator) (defn compare [this x y] ...) +(load-file "/Users/rich/dev/clojure/src/genclass.clj") + +(clojure/gen-and-save-class "/Users/rich/dev/clojure/gen/" + 'org.clojure.ClojureServlet + :extends javax.servlet.http.HttpServlet) + ) diff --git a/src/parallel.clj b/src/parallel.clj new file mode 100644 index 00000000..f2896eba --- /dev/null +++ b/src/parallel.clj @@ -0,0 +1,72 @@ +; Copyright (c) Rich Hickey. All rights reserved. +; The use and distribution terms for this software are covered by the +; Common Public License 1.0 (http://opensource.org/licenses/cpl.php) +; which can be found in the file CPL.TXT at the root of this distribution. +; By using this software in any fashion, you are agreeing to be bound by +; the terms of this license. +; You must not remove this notice, or any other, from this software. + +(in-ns 'parallel) +(clojure/refer 'clojure) + +(import '(jsr166y.forkjoin ParallelArray ParallelArrayWithBounds ParallelArrayWithFilter + ParallelArrayWithMapping Ops$Reducer Ops$Predicate)) + +(defn parray [coll] + (if (instance? ParallelArrayWithMapping coll) + coll + (ParallelArray.createUsingHandoff + (if (identical? (class coll) (class (clojure.lang.RT.EMPTY_ARRAY))) + coll + (to-array coll)) + (ParallelArray.defaultExecutor)))) + +(defn- pall [coll] + (if (instance? ParallelArrayWithMapping coll) + (. coll all) + (parray coll))) + +(defn punique [coll] + (. (parray coll) allUniqueElements)) + +(defn- reducer [f] + (proxy [Ops$Reducer] [] + (op [x y] (f x y)))) + +(defn- predicate [f] + (proxy [Ops$Predicate] [] + (op [x] (boolean (f x))))) + +;this doesn't work, passes null to reducer +(defn pcumulate [coll f init] + (.. (pall coll) (cumulate (reducer f) init))) + +(defn preduce [f init coll] + (. (parray coll) (reduce (reducer f) init))) + +(defn psort [coll] + (. (pall coll) sort)) + +(defn pbound [coll start end] + (. (parray coll) withBounds start end)) + +(defn pfilter + ([coll f] + (. (parray coll) withFilter (predicate f)))) + +(defn pfilter + ([coll f] + (. (parray coll) withFilter (predicate f)))) + +(comment + +(punique [1 2 3 2 1]) +(def v (range 10000000)) +(def a (make-array Object 1000000)) +(dotimes i (count a) + (aset a i i)) +(time (reduce + 0 a)) +(time (preduce + 0 a)) +(preduce + 0 [1 2 3 2 1]) +(preduce + 0 (psort a)) +)
\ No newline at end of file |