« Return to Thread: [jira] Created: (VELOCITY-704) VTL Simplicity - "Control" objects

[jira] Commented: (VELOCITY-704) VTL Simplicity - "Control" objects

by Velocity - Dev mailing list-2 :: Rate this Message:

Reply to Author | View in Thread


    [ https://issues.apache.org/jira/browse/VELOCITY-704?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=12675389#action_12675389 ]

Byron Foster commented on VELOCITY-704:
---------------------------------------

<quote>For instance, #break exists all the time, even when not in a #foreach</qoute>

That's only because it is implemented that way.  If you look at the #return directive it validates that it's in a #macro block at template load time (during init).  #break could do the same.  However, we can do better,  my plan was to beef up the directive validation at parse time, then Velocity smart IDE's like Veloeclipse could validate #break and #return as the user edits her VTL.  This level of validation is simply not an option for .stop().

<qoute>It is obvious what $foreach.stop() does</qoute>

This is all very subjective of course, that's why there's a hundred million languages out there.  However, people with a programming background, most users I would think, are going to instantly understand what #break does  (and #return for that matter).  And to the non-programmers it's not going to make any difference.  To me, again subjective, $foreach.stop() looks like a reference that's emitting content. I'm not against $foreach.stop() constructs, I'm more indifferent, I'm just arguing for a directive solution also.  However, I can tell you're against a dual solution, and yes I think you could make a good argument for this, so you don't need to :)

I regret having proposed #stop(parse) or #break(glass).  I think it confused the issue, when all that was of real interest to me was #return and adding an 'index' keyword to #foreach.  I was thinking #return would get as much resistance as this VELOCITY-612 :)

<qoute>then i would go back to pushing hard for just one #stop() directive</qoute>

I'll take it.  So, something like this:

#stop(all)
#stop(parse)
#stop(macro)       = #return
#stop(foreach)     = #break

What would #stop do?



> VTL Simplicity - "Control" objects
> ----------------------------------
>
>                 Key: VELOCITY-704
>                 URL: https://issues.apache.org/jira/browse/VELOCITY-704
>             Project: Velocity
>          Issue Type: New Feature
>          Components: Engine
>            Reporter: Nathan Bubna
>            Assignee: Nathan Bubna
>             Fix For: 2.0
>
>
> In the discussion for VELOCITY-680, Claude suggested the addition of what i'm calling "control" objects as a solution.   These would have the same name as the block directive or macro to which they belong.    At a minimum, these would provide get(key), set(key, value) and stop() methods to control the reference scoping and execution of the block to which they belong.   Directives could extend the basic control object to provide additional functions, such as index() and hasNext() for #foreach.   Here's some examples:
> #foreach( $user in $users )
> $user#if( $foreach.hasNext ), #end
> #if( $foreach.count > 10 ) $foreach.stop() #end
> #end
> #macro( foo $bar )
> blah blah #if( $bar == 'bar' ) $foo.stop() #end
> #set( $foo.woogie = 'woogie' )
> $foo.woogie
> #end
> #foreach( $item in $list )
>   #set( $outer = $foreach )
>   #foreach( $attr in $item.attributes )
>     #if ( $attr == $null ) $outer.stop()#end
>   #end
> #end
> ------foo.vm---------
> blah blah $template.stop() blah
> ------------------------
> #define( $foo )
> blah blah $define.stop() blah
> #end
> This could allow us to greatly simplify all sorts of things.  We could remove the #break, #stop and #return directives.  We would no longer need to have "local" contexts for foreach loops or macros; instead users could set and get local variables directly in the provided namespace.   All else would be global.   This may even cut down our internal code complexity a fair bit.  It'll certainly obviate the need for several configuration properties and internal contexts.  Everything becomes much more explicit, obvious and robust.   I also don't think it looks ugly. :)
> We would, of course, have to make sure that the StopExceptions thrown by stop() aren't wrapped into MethodInvocationExceptions.  We'd have to make the directives clean up their control when done rendering, and if they're nested in a directive of the same type, then they should save and restore the reference to the parent control.   We'd also have to figure out a good default name to give the control objects for the top-level control object, and whether it would be different than the name of the control object used during a #parse call.  $template?  $parse?  $velocity?  If we wanted to use $template--which i think works well for both top-level and #parse--then we'd probably have to make it configurable, since that's likely to conflict.   And if we make that configurable, i suppose we may as well make it configurable for the others too.
> I'm struggling to think of any real downside to this.  Most of the replaced features (implicit macro localscope, #stop, #break, $velocityHasNext) are either not default behavior or are new features.  I'd wager that most people would only have to change $velocityCount to $foreach.count.  Even that's no big deal, since this would be for a major version change.  , The worst i can think of is the fact that for a couple of these controls it would mean a few more keystrokes.  Considering all the gains in extensibility, explicitness and simplification (for us and users), i think it's worth a few keystrokes.
> What do you guys think?

--
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@...
For additional commands, e-mail: dev-help@...

 « Return to Thread: [jira] Created: (VELOCITY-704) VTL Simplicity - "Control" objects