summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/boot.clj21
-rw-r--r--src/jvm/clojure/lang/Compiler.java11
-rw-r--r--src/jvm/clojure/lang/LispReader.java25
-rw-r--r--src/jvm/clojure/lang/LockingTransaction.java2
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;
}