Re: Possible eval/templet bug

Keats Kirsch <[email protected]> Wed, 10 Aug 2005 13:08:22 -0400
Newsgroups gmane.comp.java.webmacro.user
Message-ID <[email protected]>
Marc,

I found that the new "string as templet" feature of #eval gives a nice 
workaround for this.

Try:

#setblock $render
Value is: \$value
#end

#templet $outerTemplet
   #set $value = "Hello!"
   #eval $renderString using {
      "value" : $value
   }
#end

#eval $outerTemplet using {
    "renderString" : $render
}

--Keats

Keats Kirsch wrote:

> [Resending ... didn't seem to go through yesterday.]
>
> Hey Marc.  I'm on vacation (with a very poor dial-up connection from the
> Delaware shore), but I did manage to look at this a bit.
>
> It's not actually a bug, although it's certainly a head-scratcher.  The
> issue is that the arguments to #eval are evaluated before the macro
> (templet) whose context they are being added too.  Since your argument
> to $outerTemplet "renderTemplet" is a templet, and a templet is a Macro,
> WM attempts to evaluate it -- in the current context -- before passing
> it to the $outerTemplet.  Since there is no variable $value defined in
> the current context, you get an error.
>
> The messed up error message is another issue.  It's a bit better if you
> use the CrankyEEH, but still a bit screwy.  I'll put this on my list to
> look at one of these days.
>
> I'm not sure what the best solution is.  My first thought is to use
> #setblock to define your templet argument as a plain string, and then
> convert it to a templet within the outerTemplet or something.  I may
> play around with this and see if it works.
>
> Good luck.
>
> Keats
>
> Marc Palmer wrote:
>
>> Hi,
>>
>> I've hit upon what I believe is an obscure bug in #eval/#templet in 
>> 2.0 RC1.
>>
>> I'm finding it with my JSP taglib but I don't believe it is specific to
>> the taglib, it smells more like a problem with #templet/eval. Of 
>> course a
>> unit test will prove this so that will naturally be my next course of
>> action. However I can't commit to WM from my workplace.
>>
>> ...evaluating this template:
>>
>> <html>
>> <body>
>>
>> #templet $render
>>
>> Value is: $value
>>
>> #end
>>
>> #templet $outerTemplet
>>    #set $value = "Hello!"
>>  #eval $rendertemplet using {
>>     "value" : $value
>>  }
>>
>> #end
>>
>> #eval $outerTemplet using {
>>    "rendertemplet" : $render
>> }
>>
>> </body>
>> </html>
>>
>>
>> ...the intention/expectation is that this will simply output:
>>
>>
>> <html>
>> <body>
>>
>> Value is: Hello!
>>
>> </body>
>> </html>
>>
>>
>> ...but, rather weirdly, you get this:
>>
>>
>> <html>
>> <body>
>>
>> Value is: <!-- Attempted to write an undefined variable: Hello! at
>> render:4.11 -->
>>
>> </body>
>> </html>
>>
>> Notice that it says undefined variable "Hello!" - but that is the 
>> value of
>> the variable! It's like it's trying to recursively evaluate it.
>>
>> Keats - any thoughts?
>>
>> I will try to dig into the source and write a unit test for this, but I
>> wanted to flag it in case I'm being stupid.
>>
>> Also, there seems to be an error handling bug. If your innermost templet
>> references a non-existent variable, you get something like:
>>
>> Value is: <!-- Attempted to write an undefined variable: <!-- 
>> Attempted to
>> write an undefined variable: $iknowthisdoesntexistvalue at unknown:2.58
>> --> at render:4.11 -->
>>
>>
>> ...notice that this has two error messages and unbalanced "-->" so 
>> you get
>> some nasty output in the page and interestingly two sources - unknown 
>> and
>> render. Also note that it gets the error variable name right in this 
>> case,
>> but in the first problem I talked about it uses the -value- of the
>> variable as the "unknown" variable name.
>>
>> Very confusing!
>>
>> Cheers
>>
>>
>




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf