diff options
-rw-r--r-- | src/boot.clj | 21 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 11 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LispReader.java | 25 | ||||
-rw-r--r-- | src/jvm/clojure/lang/LockingTransaction.java | 2 |
4 files changed, 57 insertions, 2 deletions
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; } |