aboutsummaryrefslogtreecommitdiff
path: root/clojurescript/clj.js
diff options
context:
space:
mode:
Diffstat (limited to 'clojurescript/clj.js')
-rw-r--r--clojurescript/clj.js76
1 files changed, 72 insertions, 4 deletions
diff --git a/clojurescript/clj.js b/clojurescript/clj.js
index 988173b6..5d212003 100644
--- a/clojurescript/clj.js
+++ b/clojurescript/clj.js
@@ -1,8 +1,12 @@
clojure = {
in_ns: function(s) {
- var ns = s.substring(1);
- if( ! window[ns] ) {
- window[ns] = {};
+ var nsparts = s.substring(1).split('.');
+ var base = window;
+ for( var i = 0; i < nsparts.length; ++i ) {
+ if( ! base[nsparts[i]] ) {
+ base[nsparts[i]] = {};
+ }
+ base = base[nsparts[i]];
}
},
refer: function(s) {},
@@ -31,7 +35,21 @@ clojure = {
return seq.rest();
},
second: function(x) { return clojure.first(clojure.rest(x)); },
- prn: print,
+ prn: function() {
+ var args = [];
+ for( var i = 0; i < arguments.length; ++i ) {
+ args.push( arguments[ i ] );
+ }
+ print( args.join(" ") );
+ },
+ hash_map: function() {
+ // This just makes a seq for now
+ var pairs = [];
+ for( var i = 0; i < arguments.length; i += 2 ) {
+ pairs.push( [ arguments[i], arguments[i + 1] ] )
+ }
+ return clojure.lang.ArraySeq.create( pairs );
+ },
count: function(x) {
if( x === null ) return 0;
if( x.count ) return x.count();
@@ -42,6 +60,11 @@ clojure = {
resolveVar: function( sym, ctxns ) {
return ctxns[ sym ] || clojure[ sym ] || window[ sym ];
},
+ def: function( ns, name, init ) {
+ var v = new clojure.lang.Var( ns, name );
+ ns["_var_" + name] = v;
+ v.push( init );
+ },
ObjSeq: {
create: function( obj ) {
var pairs = [];
@@ -55,7 +78,11 @@ clojure = {
lang: {
Numbers: {
isPos: function(x) { return x > 0; },
+ inc: function(x) { return x + 1; },
dec: function(x) { return x - 1; }
+ },
+ Util: {
+ equal: function(x,y) { return x == y; }
}
}
};
@@ -146,3 +173,44 @@ clojure.lang.LazyCons.prototype.withMeta = function(_meta) {
clojure.lang.LazyCons.prototype.seq = function() {
return this;
};
+
+
+clojure.lang.Var = function( ns, name ) {
+ this.ns = ns;
+ this.name = name;
+ this.stack = [];
+};
+
+clojure.lang.Var.prototype.push = function( val ) {
+ this.stack.push( val );
+ this.ns[ this.name ] = val;
+};
+
+clojure.lang.Var.prototype.pop = function() {
+ this.stack.pop();
+ this.ns[ this.name ] = this.stack[ this.stack.length - 1 ];
+};
+
+clojure.lang.Var.prototype.set = function( val ) {
+ this.stack.pop();
+ this.push( val );
+};
+
+clojure.lang.Var.stack = [];
+
+clojure.lang.Var.pushThreadBindings = function( m ) {
+ var vars=[], b;
+ for( var bs = m.seq(); bs; bs = bs.rest()) {
+ b = bs.first();
+ vars.push( b[0] );
+ b[0].push( b[1] );
+ }
+ clojure.lang.Var.stack.push( vars );
+};
+
+clojure.lang.Var.popThreadBindings = function() {
+ var vars = clojure.lang.Var.stack.pop();
+ for( var i = 0; i < vars.length; ++i ) {
+ vars[i].pop();
+ }
+};