Skip to content

Comment on List out of Lambda

Comments

It's always cool to see an accessible demo of the lambda calculus, but to nitpick... Isn't it cheating a bit to say this doesn't use Object when, in JavaScript, the persistent arguments object exists and is even explicitly accessible? You're just hiding Object instantiation behind function calls, and using syntactic sugar to access the local object.

I'm not totally sold that objects are a "bigger" language feature than closures, conceptually.

This celebrated discussion goes into some nice detail about object-closure equivalence:

http://people.csail.mit.edu/gregs/ll1-discuss-archive-html/m...

If you're too impatient, here's the punchline:

  The venerable master Qc Na was walking with his student, Anton.  Hoping to
  prompt the master into a discussion, Anton said "Master, I have heard that
  objects are a very good thing - is this true?"  Qc Na looked pityingly at
  his student and replied, "Foolish pupil - objects are merely a poor man's
  closures."

    Chastised, Anton took his leave from his master and returned to his cell,
  intent on studying closures.  He carefully read the entire "Lambda: The
  Ultimate..." series of papers and its cousins, and implemented a small
  Scheme interpreter with a closure-based object system.  He learned much, and
  looked forward to informing his master of his progress.

    On his next walk with Qc Na, Anton attempted to impress his master by
  saying "Master, I have diligently studied the matter, and now understand
  that objects are truly a poor man's closures."  Qc Na responded by hitting
  Anton with his stick, saying "When will you learn? Closures are a poor man's
  object."  At that moment, Anton became enlightened.

That is a much more eloquent version of what I was getting at, thank you :) To be clear, I don't really think closures are "bigger" conceptually either. I can't properly recall a time I understood one and not the other... It may be that understanding of both came simultaneously, as a humble student in a single moment of enlightenment.

I'm having to reach back into the dustbin of my mind, but I seem to recall implementing an object system using only closures at one point. As I recall, it had all of the "normal" features of objects - inheritance, member variables, methods, etc. It was done with closures and the members were accessed in a message-passing style (in scheme, (myobject 'show) for example).

Based on that, I think that closures and objects are probably equivalent in their expressive ability. Could be wrong though, like I said it was a long time ago.

I'm pretty sure this is an extended discussion/exercise in SICP.

Inheritance can be a bit tricky to fit in, as I recall, but it's quite elegant to implement basic classes and objects with just closures.

A very simple and elegant way to handle inheritance is to give each object a pointer to another object -- let's call it "prototype" -- and delegate any failed member variable or method lookups to the prototype. This is how JavaScript's object system works.

AboutSource Built by g1lg1l

Hackerly is an independent reader for Hacker News, built on the public HN API. Not affiliated with Y Combinator.