HarryO <harryo / zipworld.com.au> wrote: : In article <9jfvq1$ac4$1 / geraldo.cc.utexas.edu>, "Todd Gillespie" : <toddg / linux127.ma.utexas.edu> wrote: :> It would behoove you to read the second half of Paul Graham's recent :> paper 'Beating the Averages', at http://www.paulgraham.com/avg.html. In :> a nutshell, programmers that have not understood a particular facility :> in a language are likely to treat it as unimportant, because they know :> how to think about programs using the idioms of the languages they :> already know, but not in these unfamiliar features. To quote: : That's an interesting article. I hope Paul doesn't strain his neck : looking up to Ruby :-). You are a Blub programmer and I claim my 2 dollars. I do hope you are joking, btw. I would hate to see you read the whole article and then repeat the behavior he rails against: "I don't understand your language features therefore my language is better than yours." : Seriously, though, he mentions as one of the big features they used in : their development was the ability to define macros. Not knowing anything : much about LISP, I was wondering whether you can tell me whether ruby's : eval (perhaps along with otherruby features) can be used to achieve the : same functionality as LISP's macros, or are they more complex beasts than : that? Ie, do they provide something we're missing out on? LISP macros offer an elegant way to dynamically redefine the language. Their viability may be a consequence of the uniformity of LISP syntax which I will define here as: a prefix function call with n arguments bounded by parentheses; any argument surrounded by parentheses is a function call evaluated before the enclosing function. There are no precendence rules, whitespace significance, side effects, non-function control blocks (if, for, while in C), etc. As you can imagine, manipulating the parse trees is fantasically simple. This is either a cause or an effect of LISP programmers being more familiar with code generation than almost anyone else. Perhaps both. This is basically impossible (in terms of economic time usage) in a language with syntax less regular than LISP, like C, Ruby, Algol spawn, etc. I have written code generators in Tcl, Perl, and C, and they were all a major PITA. So there is a choice here in language design, namely, to use constructs familiar to human users (a la Perl) and difficult on the machine, or simple to the machine and pedantic/excessive/boring on the human. The choice looks simple in favor of the former, but the latter offers, if one is sufficiently formal, a way to specify needs in a very concise manner. And speaking sufficiently formally to computers is what programming is all about. Obviously this conflict will never end. I hope I illustrated the other side for you. HTH.