函数
每个功能强大的编程语言都应该具有函数这个特性。
幸运的是我们可以很容易地添加一个fun语言构造,fun将最后一个参数当作函数体,将之前的所有名称用作函数参数。
specialForms.fun = (args, scope) => {if (!args.length) {throw new SyntaxError("Functions need a body");let body = args[args.length - 1];let params = args.slice(0, args.length - 1).map(expr => {if (expr.type != "word") {throw new SyntaxError("Parameter names must be words");}return expr.name;});return function() {if (arguments.length != argNames.length) {throw new TypeError("Wrong number of arguments");}let localScope = Object.create(scope);for (let i = 0; i < arguments.length; i++) {localScope[params[i]] = arguments[i];}return evaluate(body, localScope);};};
Egg 中的函数可以获得它们自己的局部作用域。 fun形式产生的函数创建这个局部作用域,并将参数绑定添加到它。 然后求解此范围内的函数体并返回结果。
run(`do(define(plusOne, fun(a, +(a, 1))),print(plusOne(10)))`);// → 11run(`do(define(pow, fun(base, exp,if(==(exp, 0),1,*(base, pow(base, -(exp, 1)))))),print(pow(2, 10)))`);// → 1024
