TopMind is often seen arguing about the inherent superiority of TOP to functional programming. He claims that 'smart' tables are much better than 'dumb' collections. However, I think that this is in fact a meaningless debate, because tables are merely a type of collection, and database queries are the higher-order operations that sort and filter and scan and update them.
This can be most clearly seen in the LanguageIntegratedQuery [MS LINQ] project, essentially a LispMacro in a language that doesn't have LispMacros.
For instance,
from o <- someTable
where o.FrozzBozz
select o.FirstName + " " + o.LastName
translates to
someTable
.Filter( delegate (o) {return o.FrozzBozz()}, )
.Map( delegate (o) {return o.FirstName + " " + o.LastName}, )
In a language with a better syntax for anonymous functions, it would be:
someTable.filter(o => o.frozzBozz).map(o => o.firstName ++ " " ++ o.lastName)
or (shock!) you could get away with writing it cleanly without the macro, as in:
someTable filter (_.frozzBozz) map (o => o.firstName ++ " " ++ o.lastName)
[this is ScalaLanguage, which is really d*mn good at making DomainSpecificLangauges without ever breaking out the macros. RubyLanguage is also good for this...]
Order by?
(<some_long_query>).sort_by {|a| a.prod_num},
Even delete from:
date = now()
orderDB.reject! { |rec| rec.date < date - (7 years) },
Microsoft also offers a kind of "RAM table" type that allows one to do "regular" SQL on it. The advantage of this is that one can switch the implementation to a full RDBMS if the requirements grow without rewriting the queries. (I'm not sure if LINQ can do that for non-MS databases.) You are essentially reinventing a query languages with lots of "funny punctuation" in it. If we are going to start over, then let's plan a good query language this time (HowOtherQueryLanguagesAddressSqlFlaws). Ideally the query language should be app-language-independent such that I don't have to learn/use one query language for Ruby and another for PHP, etc. Query languages and GUI languages should strive to be app-language-independent in my opinion. -t