[Zope] Defining variables

Alexander Staubo alex@mop.no
Tue, 13 Jul 1999 23:54:05 +0200


>-----Original Message-----
>From: Brian Lloyd [mailto:Brian@digicool.com]
>Sent: 13. juli 1999 23:47
>To: 'Alexander Staubo'; Zope Mailing List (E-mail)
>Subject: RE: [Zope] Defining variables
>
>
>> Currently we have REQUEST.set(). This is nice, but I think there is a
>> need for a general-purpose variable namespace that isn't related to
>> REQUEST (plus the fact that typing "REQUEST.set(...)" all the
>> time isn't
>> so cool).
>>
>> I have one specific case where it's simply arduous having to mix real
>> REQUEST variables -- meaning those that come in through the
>> query string
>> or form data -- with actual request-related variables.
>>
>> How about adding something like _.set()?
>>
>> --
>> Alexander Staubo
>
>
>Doesn't the Let tag basically accomplish what you are
>asking for? From the Let tag docs:

The problem is that the let and with tags are block tags. If I have
numerous variables, that's a lot of blocks! Eg.,

<!--#let foo=1-->
  <!--#let foo=2-->
    <!--#let foo=3-->
      ...
    <!--#/let-->
  <!--#/let-->
<!--#/let-->

(And no, you can't convince to stop indenting. :-)

Indenting is just part of the reason I think the "let" tag is
inappropriate here. With the closing tag, that's just seven characters
less than the REQUEST.set() alternative! Plus line break, that's
actually five characters gained. Not much typing saved there.

<!--#call "REQUEST.set('f', 1)"-->
<!--#let f=1--><!--#/let-->

I essentially want something like

<!--#set foo=1-->
<!--#set foo=3-->
<!--#set foo=4-->

or, as I outlined, something like _.set().

>The let tag:
>
> is a new tag that lets you create blocks like:
>
> <!--#in "1,2,3,4"-->
> <!--#let num=sequence-item
>	  index=sequence-index
>	  result="num*index"-->
> <!--#var num--> * <!--#var index--> = <!--#var result-->
> <!--#/let-->
> <!--#/in-->
>
> Which yields:
>
> 1 * 0 = 0
> 2 * 1 = 2
> 3 * 2 = 6
> 4 * 3 = 12
>
> The #let tag works like the #with tag, but is more flexible in that
> it allows you to make multiple assignments, and allows you to chain
> assignments, using earlier declarations in later assignments.  Notice
> inthe ablove example, the 'result' variable is based on 'num' and
> 'index', both of which are assigned in the same #let expression.
>
> Syntacticly, each argument to be evalulated in the head of the let
> tag must be seperated by a newline.  Enclosing an argument in double
> quotes causes it to be evaluated by the DTML expression machinery.
> Un-quoted arguments are referenced by name.

Is it just me, or is this newline-separation syntax really crazy? How
does the "let" tag handle multiline expressions? Why not just use
commas? It would mean alienating those suckers who actually use commas
in object ids, but that's not a huge loss. ;-)

> Evaluation is in sequence with the result of earlier assignments
> available to later ones.  Later assignments can also override earlier
> ones, which can be helpful for longer step-by-step calculations.  The
> variables thus set are in effect for the life of the <!--#let-->
> block.
>
>
>
>Brian Lloyd        brian@digicool.com
>Software Engineer  540.371.6909
>Digital Creations  http://www.digicool.com
>

--
Alexander Staubo             http://www.mop.no/~alex/
"He could open a tin of sardines with his teeth, strike a Swan Vestas
on his chin, rope steers, drive a steam locomotive and hum all the
works of Gilbert and Sullivan without becoming confused or breaking
down in tears."
--Robert Rankin, _The Book of Ultimate Truths_