1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
|
/**
* (C) Copyright 2007-2008 Jeremy Maitin-Shepard
*
* Use, modification, and distribution are subject to the terms specified in the
* COPYING file.
**/
function keyword_argument(name, value)
{
this.name = name;
this.value = value;
}
function keyword_argument_forwarder(args)
{
this.args = args;
}
function _get_keyword_argument_setter(name) {
return function (value) { return new keyword_argument(name, value); }
}
function _get_keyword_argument_getter(name) {
return function () { return new keyword_argument(name, true); }
}
// This function must be called with all string arguments, all of
// which must begin with "$".
function define_keywords()
{
for (var i = 0; i < arguments.length; ++i)
{
var name = arguments[i];
this.__defineSetter__(name, _get_keyword_argument_setter(name));
this.__defineGetter__(name, _get_keyword_argument_getter(name));
}
}
var define_keyword = define_keywords;
function forward_keywords(args)
{
return new keyword_argument_forwarder(args);
}
// This is called with a function's `arguments' variable. Additional
// default values can also be specified as subsequent arguments.
function keywords(args)
{
/* First add our own arguments. */
for (var i = 1; i < arguments.length; ++i)
{
var arg = arguments[i];
args[arg.name] = arg.value;
}
function helper(in_args)
{
// Begin at the first "undeclared" argument
for (var i = in_args.callee.length; i < in_args.length; ++i)
{
var arg = in_args[i];
if (arg instanceof keyword_argument)
args[arg.name] = arg.value;
else if (arg instanceof keyword_argument_forwarder)
helper(arg.args);
}
}
helper(args);
}
|