Hacker News new | ask | show | jobs
by kuni-toko-tachi 4133 days ago
Perl always will be my favorite language. Its absolutely a joy to write. What's interesting to me is that all the things that people like about JavaScript, Perl had first, and I think better (closures, first class functions).

The criticisms that people had about Perl, such as that it langrage like line noise was unfortunate. Being able to tell whether something was a scalar, array, or hash by the character that preceded it was helpful.

Being able to slap a set of braces around code to create a closure was also much better than needing to do the same in a function like JavaScript.

Perl formed some much new ground. CPAN was the predecessor of npm, etc.

I'm just glad to be able to write functional code again through JavaScript, just like when I wrote Perl. I don't miss writing Java (or any static typed object oriented language) at all, and hope I never will again. I just hope that ES6 doesn't turn JavaScript engineers into object oriented programmers.

1 comments

Which popular language nowadays doesn't have closures? Even the so hated (by HN) PHP has had that for many years already.
Python is often claimed not to have closures but that isn't really true, what it doesn't have is anonymous functions. It does have a lambda statement, but that is limited to a single statement.

So what you end up writing is more akin to:

    def multiplier_maker(a):
      def temp(b):
        return b * a
      return temp
That is because Python allows you to declare a function anyware, even inside other functions.
And if you want to emulate static variables in a function, you can do that:

    def counter():
        counter.x += 1
        return counter.x

    counter.x = 0
    counter()
    > 1
    counter()
    > 2
Beware! singleton variables, mutable state, etc.
You can do it by closing over a variable as well. Python closes over things just fine, it just has problems rebinding variables in outer scopes that aren't the global one. Here, I just make the variable a container, so I can alter a value inside it, instead of rebinding it ( only python2 has this problem, python3 has a "nonlocal" keyword to work around this in the language )

    >>> def counter():
    ...   x = [ 1 ]
    ...   def count():
    ...     y = x[ 0 ]
    ...     x[ 0 ] += 1
    ...     return y
    ...   return count
    ... 
    >>> count = counter()
    >>> count()
    1
    >>> count()
    2
    >>> count()
    3
    >>> count()
    4
    >>> 
    >>> otherCount = counter()
    >>> otherCount()
    1
    >>> otherCount()
    2
    >>> count()
    5
    >>> count()
    6
    >>> otherCount()
    3
    >>>
> what it doesn't have is anonymous functions

If it's not anonymous it's not a closure though.

Bullshit. It closures around its environment, it is a closure.
Python.
Under what definition of closure does python lack them?