Evan Simpson wrote:
----- Original Message ----- From: Tres Seaver <tseaver@palladion.com>
Or, as an alternative, we could extend the <dtml-in> tag to pass in a filter expression as an additional argument::
<dtml-in name=objectValues filter="self.hasMetaType( 'Document' )">
On further thought, this is better solved by repeating
<dtml-forever> <dtml-mantra> Separate content from presentation! </dtml-mantra> </dtml-forever>
More seriously, PythonMethods are the Right Thing (TM) here.
I disagree ;-) Not that PMs aren't good for this; they are, of course. But I'd hate to have to write one for something this piddling when the extension really wouldn't be that bad:
<dtml-in objectValues filter="meta_type == 'DTML Document'">
Ah, I was not advocating removing the argument from object values -- I was backtracking on the idea of adding a "filter=" attribute to the <dtml-in> tag. I changed my ground because, for anything more complicated than the simple meta_type check, the design "smells better" if I factor the filtering out to a PythonMethod (it gets much easier to reuse or parameterize the logic, for instance).
If the condition was more complex, then I would lean towards encapsulating it in a PM, and writing:
<dtml-in objectValues filter=LeftHandedWuzzleWidgets>
Or just:: <dtml-in LeftHandedWuzzleWidgets>
This allows you some orthogonality between your condition and the sequence you're applying it to.
P.S.: This would be even cooler, except PythonMethods don't have map/filter available:
I'm still not sure why DTML leaves out filter and reduce. 'map' I can sort of understand, but not the other two. Put them in DTML, and PMs get them automatically.
Blocking the "simple" uses of map (apply a function to each item in a list) makes no sense: that is logically no different than removing <dtml-in>! Funkier uses, like splicing parallel lists into lists of tuples, maybe. I agree that adding filter and reduce would be dead easy; I don't use reduce much myself, but filter would be really nice to have. Adding a filter= keyword to the <dtml-in> tag doesn't quite do it -- applying an arbitrary filter expression to the objects one normally iterates over seems non-trivial, at least without munging in lambda, too (I can hear the screams already!). I guess one could require that the filter attribute name a callable (as in your example above). Best, Tres. -- ========================================================= Tres Seaver tseaver@palladion.com 713-523-6582 Palladion Software http://www.palladion.com