Fri, 19 Nov 2010 03:48:04 +0000
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);