Formalise the beginnings of a baselib, add setmetatable.

Fri, 19 Nov 2010 03:48:04 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Fri, 19 Nov 2010 03:48:04 +0000
changeset 67
782274d793ac
parent 66
d02e5e93aeef
child 68
5b815d3591e2

Formalise the beginnings of a baselib, add setmetatable.

lvm.js file | annotate | diff | comparison | revisions
--- a/lvm.js	Fri Nov 19 03:47:22 2010 +0000
+++ b/lvm.js	Fri Nov 19 03:48:04 2010 +0000
@@ -547,19 +547,39 @@
 
 var default_environment = new LValue("table", {});
 
-var print;
-if(typeof(document) == "object")
-	print = function (a) { document.write(a+"<br/>") }; // Browser
-else
-	print = require("sys").puts; // Nodejs
+// Standard library
 
+var baselib = {
+	print: function (args)
+	{
+		sys.print(args[0].toString());
+		for(var i = 1; i<args.length; i++)
+			sys.print("\t"+args[i].toString());
+		sys.print("\n");
+		return 0;
+	},
+	setmetatable: function (args)
+	{
+		if(args.length!=2)
+			throw "setmetatable expects 2 arguments, got "+args.length;
+		args[0].setMetatable(args[1]);
+		return 1;
+	}
+};
+
+for(var name in baselib)
+{
+	default_environment.setIndex(LValueFromString(name), LValueFromFunction(testvm, baselib[name]));
+}
+
+// Metatable on environment to print out nil global accesses
 var mt = new LValue("table", {});
 mt.setIndex(
 	LValueFromString("__index"),
 	LValueFromFunction(testvm, function (t, k) { sys.puts("Access of nil global: "+k); })
 );
 default_environment.setMetatable(mt);
-default_environment.setIndex(LValueFromString("print"), LValueFromFunction(testvm, print));
+
 
 var f = new LFunction(testvm, c, default_environment);
 

mercurial