are functions being passed/returned as closures?
if you're asking whether functions in Mathematica are first-class values, then yes. everything in Mathematica is first-class. functions are just symbols that have associated pattern-matching rules in the form f[___], otherwise they are the same as any other symbol.
you can do, for example:
RandomChoice[{Plus, Times}][2, 3]
where the result will be either 5 or 6. in more explicit form: If[RandomReal[] < .5, Plus, Times][2, 3]
example of an "anonymous" function: (#1^2 + #2^2 &)[2, 3]
square of all numbers from 1 to 100: #^2 & /@ Range[100]
simpler form: Range[100]^2
all pairwise products of the first seven prime numbers (among themselves): Times @@@ Tuples[Prime /@ Range[7], 2]
etc.I'm asking if first class functions also can be closures. Does it use lexical binding?
i think i answered that question already, which is yes, but technically no. here is a rough Javascript version of the original example:
makeObj[] := Module[{obj, i = 0},
obj["inc"] := ++i;
obj["dec"] := --i;
obj[] := i;
obj];
makeObj = function() {
var i = 0;
var obj = function(in) {
switch(in) {
case "inc" : return ++i;
case "dec" : return --i;
case undefined: return i;
};
};
return obj;
};
another point is that you could, if you wanted to, create your own version of Module and other scoping stuff, since it's a matter of making a macro by using the HoldAll atttribute [1] and using 'ReplaceAll' to replace specific variables or arbitrary structures
[1] http://reference.wolfram.com/mathematica/ref/HoldAll.html