2 * (C) Copyright 2008 Jeremy Maitin-Shepard
4 * Use, modification, and distribution are subject to the terms specified in the
8 require("pretty-print.js");
11 * @param name specifies the name of the label to be defined
13 * The remaining arguments should be strings, specifying the names of
14 * required arguments. Additionally, the last additional argument can
15 * be `null', which indicates that unlimited optional arguments can
16 * follow. If `null' is not specified as the last argument, then it is
17 * assumed that all optional arguments are keyword arguments. The
18 * optional arguments are stored as an array in a member called $.
20 function define_label (name) {
21 var allow_optional = false;
22 var required_args = [];
23 for (let i = 1, ii = arguments.length; i < ii; ++i) {
24 if (arguments[i] === null) {
25 allow_optional = true;
27 throw new Error("null must be the last argument");
29 required_args.push(arguments[i]);
32 function toString () {
33 let optional = this.$;
36 let printed_args = [];
37 let seen_defined_yet = false;
38 for (let i = required_args.length - 1; i >= 0; --i) {
39 let arg = required_args[i];
40 if (seen_defined_yet || this[arg] !== undefined) {
41 printed_args.unshift(arg + " = " + pretty_print_value(this[arg]));
42 seen_defined_yet = true;
45 printed_args.push.apply(null, optional.map(pretty_print_value));
47 if (i.length > 1 && i[0] == "$")
48 printed_args.push(i + " = " + this[i]);
50 if (printed_args.length > 0)
51 printed_args = "(" + printed_args.join(", ") + ")";
54 return this._name + printed_args;
57 result = function () {
58 var o = { _name: name, toString: toString, _id: result, __is_label: true, toSource: toString };
59 let max_req_arg = arguments.length;
60 if (max_req_arg > required_args.length)
61 max_req_arg = required_args.length;
62 for (let i = 0; i < max_req_arg; ++i)
63 o[required_args[i]] = arguments[i];
65 o.$ = Array.prototype.slice.call(arguments, required_args.length);
67 write_keywords(o, arguments, required_args.length);
73 for (let i in required_args)
74 result[i] = undefined;
75 result.toString = toString;
76 result.__is_label = true;
77 conkeror[name] = result;
80 function label_id (value) {