Name: Anonymous 2009-07-03 12:54
In Scheme:
In C++, precisely the same idea is expressed as
When the compiler processes an application:
(define foo (lambda (a b) (+ a b)))The lambda-expression when evaluated produces the value of a procedural type. The define form binds this value to an identifier foo. Evaluation of an expression
(foo 1 2)looks up the procedural value bound to this identifier, and applies it.In C++, precisely the same idea is expressed as
Lambda((int a, int b), int, return a+b) foo;where
#define Lambda(args,ret_type,body) \
class MakeName(__Lambda___) { \
public: ret_type operator() args { body; } }The Lambda construction creates a procedural type (class). The instantiation operator -- called 'declaration' in plain C -- "binds" this apply-able type to an instance foo. This sounds better in reverse: foo is bound to a value of a procedural type. Or, foo is instantiated as an object of a class that implements a callable interface.When the compiler processes an application:
cout << "foo(1,2) is " << foo(1,2) << endl;it looks up the type of foo, finds the procedural class and invokes the appropriate method. The similarity between the two expressions -- in Scheme and C++ -- is almost complete. The major difference is a compile vs. run-time lookup of values and bindings. Optimizing Scheme compilers blur even this difference.