summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRich Hickey <richhickey@gmail.com>2008-01-25 23:10:39 +0000
committerRich Hickey <richhickey@gmail.com>2008-01-25 23:10:39 +0000
commit2fd70293876dc3713cb9deb1c3e1f237336c6b62 (patch)
tree799777f31e9d425c8b363f2f3cef6e2fbe2a8f76 /src
parent8da00aca0e47b20cd7c50e29d42ed6a58e9a7a62 (diff)
interim checkin - do not use
Diffstat (limited to 'src')
-rw-r--r--src/boot.clj117
-rw-r--r--src/jvm/clojure/lang/Compiler.java6
-rw-r--r--src/jvm/clojure/lang/Namespace.java21
-rw-r--r--src/jvm/clojure/lang/RT.java4
-rw-r--r--src/jvm/clojure/lang/Repl.java5
-rw-r--r--src/jvm/clojure/lang/Var.java4
6 files changed, 139 insertions, 18 deletions
diff --git a/src/boot.clj b/src/boot.clj
index 64b765c0..c47005c5 100644
--- a/src/boot.clj
+++ b/src/boot.clj
@@ -6,7 +6,7 @@
; the terms of this license.
; You must not remove this notice, or any other, from this software.
-(in-namespace 'clojure)
+(in-ns 'clojure)
(def list (. clojure.lang.PersistentList creator))
@@ -81,6 +81,7 @@
(defn rrest [x] (rest (rest x)))
(defn #^Boolean = [x y] (. clojure.lang.RT (equal x y)))
+(defn #^Boolean != [x y] (not (= x y)))
(defn #^String str [#^Object x]
(if x (. x (toString)) ""))
@@ -689,7 +690,7 @@
(defn import [& import-lists]
(when import-lists
- (let [#^clojure.lang.Namespace ns *current-namespace*
+ (let [#^clojure.lang.Namespace ns *ns*
pkg (ffirst import-lists)
classes (rfirst import-lists)]
(doseq c classes
@@ -707,7 +708,7 @@
; ns (first rlist)
; names (rest rlist)]
; (doseq name names
-; (when (. clojure.lang.Var (find (symbol(str *current-namespace*) (str name))))
+; (when (. clojure.lang.Var (find (symbol(str *ns*) (str name))))
; (throw (new Exception (strcat "Name conflict: " name " already exists in this namespace"))))
; (let [varsym (symbol (str ns) (str name))
; var (. clojure.lang.Var (find varsym))
@@ -998,14 +999,102 @@
(defn distinct [coll]
(keys (to-set coll)))
+(defn filter-vals [pred amap]
+ (loop [ret {} es (seq amap)]
+ (if es
+ (if (pred (val (first es)))
+ (recur (assoc ret (key (first es)) (val (first es))) (rest es))
+ (recur ret (rest es)))
+ ret)))
+
+(defn filter-keys [pred amap]
+ (loop [ret {} es (seq amap)]
+ (if es
+ (if (pred (key (first es)))
+ (recur (assoc ret (key (first es)) (val (first es))) (rest es))
+ (recur ret (rest es)))
+ ret)))
+
+(defn find-ns [sym]
+ (. clojure.lang.Namespace (find sym)))
+
+(defn create-ns [sym]
+ (. clojure.lang.Namespace (findOrCreate sym)))
+
+(defn remove-ns [sym]
+ (. clojure.lang.Namespace (remove sym)))
+
+(defn all-ns []
+ (. clojure.lang.Namespace (all)))
+
+(defn ns-name [#^clojure.lang.Namespace ns]
+ (. ns (getName)))
+
+(defn ns-map [#^clojure.lang.Namespace ns]
+ (. ns (getMappings)))
+
(defn export [syms]
(doseq sym syms
- (.. *current-namespace* (intern sym) (setExported true))))
+ (.. *ns* (intern sym) (setExported true))))
(defn exports [#^clojure.lang.Namespace ns]
- (filter (fn [v] (and (instance? clojure.lang.Var v)
+ (filter-vals (fn [v] (and (instance? clojure.lang.Var v)
(. v (isExported))))
- (vals (. ns (getMappings)))))
+ (ns-map ns)))
+
+(defn imports [#^clojure.lang.Namespace ns]
+ (filter-vals (partial instance? Class) (ns-map ns)))
+
+(defn refer [ns-sym & filters]
+ (let [ns (find-ns ns-sym)
+ fs (apply hash-map filters)
+ nsexports (exports ns)
+ rename (or (:rename fs) {})
+ exclude (to-set (:exclude fs))
+ to-do (or (:only fs) (keys nsexports))]
+ (doseq sym to-do
+ (when-not (exclude sym)
+ (let [var (nsexports sym)]
+ (when-not var
+ (throw (new java.lang.IllegalAccessError (strcat sym " is not exported"))))
+ (. *ns* (refer (or (rename sym) sym) var)))))))
+
+(defn refers [#^clojure.lang.Namespace ns]
+ (filter-vals (fn [v] (and (instance? clojure.lang.Var v)
+ (!= ns (. v ns))))
+ (ns-map ns)))
+
+(defn interns [#^clojure.lang.Namespace ns]
+ (filter-vals (fn [v] (and (instance? clojure.lang.Var v)
+ (= ns (. v ns))))
+ (ns-map ns)))
+
+(defn take-nth [n coll]
+ (when (seq coll)
+ (lazy-cons (first coll) (take-nth n (drop n coll)))))
+
+(defn interleave [& colls]
+ (apply concat (apply map list colls)))
+
+(defn get-var [#^clojure.lang.Var x]
+ (. x (get)))
+
+(defn set-var [#^clojure.lang.Var x val]
+ (. x (set val)))
+
+(defmacro with-local-vars [name-vals-vec & body]
+ `(let [~@(interleave (take-nth 2 name-vals-vec)
+ (repeat '(. clojure.lang.Var (create))))]
+ (try
+ (. clojure.lang.Var (pushThreadBindings (hash-map ~@name-vals-vec)))
+ ~@body
+ (finally (. clojure.lang.Var (popThreadBindings))))))
+
+(defn resolve-in [ns sym]
+ (. clojure.lang.Compiler (resolveIn ns sym)))
+
+(defn resolve [sym]
+ (resolve-in *ns* sym))
(export
'( load-file load
@@ -1014,7 +1103,7 @@
meta with-meta defmacro when when-not
nil? not first rest second
ffirst frest rfirst rrest
- = str strcat gensym cond
+ = != str strcat gensym cond
apply list* delay lazy-cons fnseq concat
and or + * / - == < <= > >=
inc dec pos? neg? zero? quot rem
@@ -1038,12 +1127,12 @@
doseq dotimes into
eval import
;unimport
- ;refer unrefer
- in-namespace
+ refer refers interns
+ in-ns
;unintern
into-array array
make-proxy implement
- pr prn print println newline *out* *current-namespace* *print-meta* *print-readably*
+ pr prn print println newline *out* *ns* *print-meta* *print-readably*
doto memfn
read *in* with-open
time
@@ -1060,8 +1149,12 @@
*warn-on-reflection*
resultset-seq
to-set distinct
- export exports
+ export exports imports ns-map
identical? instance?
- load-file in-namespace
+ load-file in-ns find-ns
+ filter-vals filter-keys find-ns create-ns remove-ns
+ take-nth interleave get-var set-var with-local-vars
+ resolve-in resolve
+ all-ns ns-name
))
diff --git a/src/jvm/clojure/lang/Compiler.java b/src/jvm/clojure/lang/Compiler.java
index 7855a281..aa20ce65 100644
--- a/src/jvm/clojure/lang/Compiler.java
+++ b/src/jvm/clojure/lang/Compiler.java
@@ -3158,6 +3158,10 @@ private static Expr analyzeSymbol(Symbol sym) throws Exception{
}
static Object resolve(Symbol sym) throws Exception{
+ return resolveIn(currentNS(), sym);
+}
+
+static public Object resolveIn(Namespace n, Symbol sym) throws Exception{
//note - ns-qualified vars must already exist
if(sym.ns != null)
{
@@ -3177,7 +3181,7 @@ static Object resolve(Symbol sym) throws Exception{
}
else
{
- Object o = currentNS().getMapping(sym);
+ Object o = n.getMapping(sym);
if(o == null)
throw new Exception("Unable to resolve symbol: " + sym + " in this context");
return o;
diff --git a/src/jvm/clojure/lang/Namespace.java b/src/jvm/clojure/lang/Namespace.java
index 8893b9e9..58da4da7 100644
--- a/src/jvm/clojure/lang/Namespace.java
+++ b/src/jvm/clojure/lang/Namespace.java
@@ -15,17 +15,29 @@ package clojure.lang;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;
-public class Namespace{
+public class Namespace {
final public Symbol name;
final AtomicReference<IPersistentMap> mappings = new AtomicReference<IPersistentMap>();
final static ConcurrentHashMap<Symbol, Namespace> namespaces = new ConcurrentHashMap<Symbol, Namespace>();
+public String toString() {
+ return "#<Namespace: " + name + ">";
+}
+
Namespace(Symbol name){
this.name = name;
mappings.set(RT.DEFAULT_IMPORTS);
}
+public static ISeq all(){
+ return RT.seq(namespaces.values());
+}
+
+public Symbol getName(){
+ return name;
+}
+
public IPersistentMap getMappings(){
return mappings.get();
}
@@ -104,6 +116,12 @@ public static Namespace findOrCreate(Symbol name){
return ns == null ? newns : ns;
}
+public static Namespace remove(Symbol name){
+ if(name.equals(RT.CLOJURE_NS.name))
+ throw new IllegalAccessError("Cannot remove clojure namespace");
+ return namespaces.remove(name);
+}
+
public static Namespace find(Symbol name){
return namespaces.get(name);
}
@@ -118,4 +136,5 @@ public Var findInternedVar(Symbol symbol){
return (Var) o;
return null;
}
+
}
diff --git a/src/jvm/clojure/lang/RT.java b/src/jvm/clojure/lang/RT.java
index aa09bd9e..4edfc3bd 100644
--- a/src/jvm/clojure/lang/RT.java
+++ b/src/jvm/clojure/lang/RT.java
@@ -110,14 +110,14 @@ final static Keyword AGENT_KEY = Keyword.intern("clojure", "agent");
// Module.findOrCreateModule("clojure/user"));
final static Symbol LOAD_FILE = Symbol.create("load-file");
-final static Symbol IN_NAMESPACE = Symbol.create("in-namespace");
+final static Symbol IN_NAMESPACE = Symbol.create("in-ns");
final static Symbol EXPORTS = Symbol.create("*exports*");
final static Var EXPORTS_VAR = Var.intern(CLOJURE_NS, EXPORTS, PersistentHashMap.EMPTY);
//final static Symbol EQL_REF = Symbol.create("eql-ref?");
static final Symbol IDENTICAL = Symbol.create("identical?");
//symbol
-final static Var CURRENT_NS = Var.intern(CLOJURE_NS, Symbol.create("*current-namespace*"),
+final static Var CURRENT_NS = Var.intern(CLOJURE_NS, Symbol.create("*ns*"),
CLOJURE_NS);
final static Var PRINT_META = Var.intern(CLOJURE_NS, Symbol.create("*print-meta*"), F);
diff --git a/src/jvm/clojure/lang/Repl.java b/src/jvm/clojure/lang/Repl.java
index 95a2067c..26273e87 100644
--- a/src/jvm/clojure/lang/Repl.java
+++ b/src/jvm/clojure/lang/Repl.java
@@ -16,6 +16,9 @@ import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Repl{
+static final Symbol REFER = Symbol.create("clojure", "refer");
+static final Symbol QUOTE = Symbol.create("quote");
+static final Symbol CLOJURE = Symbol.create("clojure");
public static void main(String[] args){
for(String file : args)
@@ -45,7 +48,7 @@ public static void main(String[] args){
));
w.write("Clojure\n");
RT.inNamespace.invoke(Symbol.create("user"));
-
+ Compiler.eval(RT.list(REFER, RT.list(QUOTE, CLOJURE)));
for(; ;)
{
try
diff --git a/src/jvm/clojure/lang/Var.java b/src/jvm/clojure/lang/Var.java
index 827ed5fc..25c67e94 100644
--- a/src/jvm/clojure/lang/Var.java
+++ b/src/jvm/clojure/lang/Var.java
@@ -65,7 +65,9 @@ public static Var intern(Namespace ns, Symbol sym, Object root, boolean replaceR
public String toString(){
- return "#<Var: " + (ns != null ? (ns.name + "/") : "") + (sym != null ? sym.toString() : "--unnamed--") + ">";
+ return "#<Var: " + (ns != null ? (ns.name + "/") : "") +
+ (sym != null ? sym.toString() : "--unnamed--") +
+ (exported?" (exported)":"") + ">";
}
public static Var find(Symbol nsQualifiedSym){