[Date Prev][Date Next][Thread Prev][Thread Next]
[Date Index]
[Thread Index]
- Subject: Re: LuaMacro
- From: Bret Victor <bret@...>
- Date: Thu, 3 Jan 2008 22:27:37 +0000 (UTC)
Vyacheslav Egorov <mraleph <at> gorodok.net> writes:
> Functions can manipulate only values, while macroses can manipulate
> "segments of computation" (expressions and statements) (e.g. one cannot
> write elegant looking ifthenelse function, there will be a bunch of
> lambdas)
I would argue that Smalltalk's style of if-then-else is elegant, mostly
because the lambdas are elegant. :)
-- Lua
if k > 7 then a:foo(k) else a:bar(k) end
"Smalltalk"
(k > 7) ifTrue: [a foo:k] ifFalse: [a bar:k]
The (k > 7) expression yields a Boolean object. The ifTrue and ifFalse above
are not language keywords, but simply a method of the Boolean class. The
method is passed lambdas, which are conveniently expressed with square
brackets.
Haskell provides even more elegant possibilities:
-- Haskell
iff (k > 7) (a foo k) (a bar k)
There actually is an if-then-else special form in Haskell, but it's easy to
define as an ordinary function:
iff True x _ = x
iff False _ y = y
This works because Haskell is lazy, so unused function arguments are never
evaluated.
The point is that, in an expressive enough language, control structures can
be defined with functions, not macros. You just need a concise syntax for
deferred evaluation (such as Smalltalk's brackets, or Haskell's defer-
everything policy).