From c16ce61aeb730ccd3ab03fc51ca6437e42e752a2 Mon Sep 17 00:00:00 2001 From: Rich Hickey Date: Fri, 21 Sep 2007 20:40:40 +0000 Subject: transaction support --- src/boot.clj | 21 +++++++++++++++++++++ src/jvm/clojure/lang/Compiler.java | 11 +++++++++++ src/jvm/clojure/lang/LispReader.java | 25 ++++++++++++++++++++++++- src/jvm/clojure/lang/LockingTransaction.java | 2 +- 4 files changed, 57 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/boot.clj b/src/boot.clj index b1dbe2ab..53fd5842 100644 --- a/src/boot.clj +++ b/src/boot.clj @@ -287,3 +287,24 @@ (. Var (pushThreadBindings (hash-map ~@(var-ize bindings)))) ~@body) (. Var (popThreadBindings))))) + +;;Refs +(defn ref [x] + (new Ref x)) + +(defn deref [#^Ref ref] + (. ref (get))) + +(defn deref! [#^Ref ref] + (. ref (currentVal))) + +(defn commute [#^Ref ref fun] + (. ref (commute fun))) + +(defn set [#^Ref ref val] + (. ref (set val))) + +(defmacro sync [& body] + `(. clojure.lang.LockingTransaction + (runInTransaction (fn [] ~@body)))) + diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java index a9552adc..9035da7a 100644 --- a/src/jvm/clojure/lang/Compiler.java +++ b/src/jvm/clojure/lang/Compiler.java @@ -2651,6 +2651,17 @@ public static Object load(InputStream s) throws Exception{ } public static void main(String[] args){ + + for(String file : args) + try + { + loadFile(file); + } + catch(Exception e) + { + e.printStackTrace(); + } + //repl LineNumberingPushbackReader rdr = new LineNumberingPushbackReader(new InputStreamReader(System.in)); OutputStreamWriter w = new OutputStreamWriter(System.out); diff --git a/src/jvm/clojure/lang/LispReader.java b/src/jvm/clojure/lang/LispReader.java index 3c6a250e..aba23a7c 100644 --- a/src/jvm/clojure/lang/LispReader.java +++ b/src/jvm/clojure/lang/LispReader.java @@ -31,6 +31,7 @@ static Symbol VECTOR = Symbol.create("clojure", "vector"); static Symbol WITH_META = Symbol.create("clojure", "with-meta"); static Symbol META = Symbol.create("clojure", "meta"); static Symbol DEREF = Symbol.create("clojure", "deref"); +static Symbol DEREF_BANG = Symbol.create("clojure", "deref!"); static Keyword LINE_KEY = Keyword.intern("clojure", "line"); static IFn[] macros = new IFn[256]; @@ -54,7 +55,7 @@ static macros['"'] = new StringReader(); macros[';'] = new CommentReader(); macros['\''] = new WrappingReader(Compiler.QUOTE); - macros['@'] = new WrappingReader(DEREF); + macros['@'] = new DerefReader(); macros['^'] = new WrappingReader(META); macros['`'] = new SyntaxQuoteReader(); macros['~'] = new UnquoteReader(); @@ -314,6 +315,28 @@ static class WrappingReader extends AFn{ } +static class DerefReader extends AFn{ + + public Object invoke(Object reader, Object quote) throws Exception{ + PushbackReader r = (PushbackReader) reader; + int ch = r.read(); + if(ch == -1) + throw new Exception("EOF while reading character"); + if(ch == '!') + { + Object o = read(r, true, null, true); + return RT.list(DEREF_BANG, o); + } + else + { + r.unread(ch); + Object o = read(r, true, null, true); + return RT.list(DEREF, o); + } + } + +} + static class DispatchReader extends AFn{ public Object invoke(Object reader, Object hash) throws Exception{ int ch = ((Reader) reader).read(); diff --git a/src/jvm/clojure/lang/LockingTransaction.java b/src/jvm/clojure/lang/LockingTransaction.java index 3fe11c04..4ccdd8ab 100644 --- a/src/jvm/clojure/lang/LockingTransaction.java +++ b/src/jvm/clojure/lang/LockingTransaction.java @@ -163,7 +163,7 @@ private boolean barge(Info refinfo){ static LockingTransaction getEx(){ LockingTransaction t = transaction.get(); - if(t.info == null) + if(t == null || t.info == null) throw new IllegalStateException("No transaction running"); return t; } -- cgit v1.2.3-70-g09d2