diff options
author | Rich Hickey <richhickey@gmail.com> | 2008-01-25 23:10:39 +0000 |
---|---|---|
committer | Rich Hickey <richhickey@gmail.com> | 2008-01-25 23:10:39 +0000 |
commit | 2fd70293876dc3713cb9deb1c3e1f237336c6b62 (patch) | |
tree | 799777f31e9d425c8b363f2f3cef6e2fbe2a8f76 /src | |
parent | 8da00aca0e47b20cd7c50e29d42ed6a58e9a7a62 (diff) |
interim checkin - do not use
Diffstat (limited to 'src')
-rw-r--r-- | src/boot.clj | 117 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Compiler.java | 6 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Namespace.java | 21 | ||||
-rw-r--r-- | src/jvm/clojure/lang/RT.java | 4 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Repl.java | 5 | ||||
-rw-r--r-- | src/jvm/clojure/lang/Var.java | 4 |
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){ |