summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-05-14 19:02:41 +0000
committerRich Hickey <richhickey@gmail.com>2008-05-14 19:02:41 +0000
commitbb881f6a8a89edf08e798316bfb293a18118d4d6 (patch)
treec06478a0bc46c510fca58c6347024e21a9907e31 /src
parentf0562071873fbd9f8654bbb6663ad8a1a34e0c65 (diff)
added parallel.clj, fork/join support - in progress
Diffstat (limited to 'src')
-rw-r--r--src/genclass.clj12
-rw-r--r--src/parallel.clj72
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