News for hackers. Stuff that matters.
Re:Wolfram Language by tokipin on Sunday November 24, 2013 @06:29PM (#6791673)
yes, using Module primarily. here's one way you might make a basic object-like thing (though i would generally advise against OO stuff in Mathematica. part of the power of the language is due to how it keeps everything straightforwardly manipulable):

    makeObj[] := Module[{obj, i = 0},
     obj["inc"] := ++i;
     obj["dec"] := --i;
     obj[] := i;
     obj];
precisely speaking, however, Module simply renames symbols to make them unique. the effect is the same as a closure, but it isn't a "pure" closure like you would find in other functional languages, because you can do for example Names["i*"] and find that the supposedly-private 'i' has the name i$2656 and you can alter its value that way

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

Re:Wolfram Language by lispm on Monday November 25, 2013 @02:36PM (#6796345)
are functions being passed/returned as closures?
Re:Wolfram Language by tokipin on Monday November 25, 2013 @08:25PM (#6798438)
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.
Re:Wolfram Language by lispm on Wednesday November 27, 2013 @01:10PM (#6809916)
I'm asking if first class functions also can be closures. Does it use lexical binding?
Re:Wolfram Language by tokipin on Wednesday November 27, 2013 @08:12PM (#6812453)
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;
    };