Issue #11331 has been updated by Brice Figureau.
Henrik Lindberg wrote: > After some discussion on #puppet-dev an idea was raised that a more function > call style (as opposed to method call style) may be more appreciated. > The pull request is now updated with this. > > These are now equivalent: > [...] > > It is still the same foreach function, only difference is in who gets to make > the call (Function, or MethodCall). I didn't fully the development nor this ticket, but I really think the syntax should be a bit more distinct from ruby blocks. I mean puppet is a different language, and should always be (or we should all use the ruby dsl). I'd favor something like this that more closely looks like puppet code to me: <pre> FOREACH rvalue { parameters => statements } </pre> Also, I'm not sure I got the underlying reasons for the syntax with an expression instead of a statement (unless it is a requirement from the existing grammar and racc being fiddly). But if you could merge both syntax to my aforementioned example that'd be perfect :) ---------------------------------------- Feature #11331: Add 'foreach' structure in manifests https://projects.puppetlabs.com/issues/11331#change-82115 Author: Steve Shipway Status: Needs Decision Priority: High Assignee: J.D. Welch Category: language Target version: 3.x Affected Puppet version: Keywords: ux backlog Branch: https://github.com/puppetlabs/puppet/pull/1420 I doubt this would be simple to do, but it would be very useful to be able to do something like this: $variable = [ 'a', 'b', 'c' ] foreach $loop $variable { file { "/tmp/$loop": content=>"I am file $loop"; } } While it is already possible to use an array as a namevar to get something similar, it doesnt allow you to have calculated parameters as well. This would not be expected to break the declarative nature of puppet, though it would bring in a new variable scope in the loop. Using a define with an array for the namevar would work provided the top level could not be called multiple times. We want to have something like this: define firewall($users,$port) { iptables::open { $users: port=>$port; } } node foo { $webusers = [ 'fred', 'sid' ] $sshusers = [ 'fred', 'joe' ] firewall { port80: users=>$webusers, port=>80; } firewall { port22: users=>$sshusers, port=>22; } } This example would fail because the iptables::open define is called with user 'fred' two times (although with a different port parameter). If we could instead have a foreach iteration then something like this would be useable: define firewall($users,$port) { foreach $users { iptables::open { "$loop:$port": user=>$loop, port=>$port; } } } This would ensure a unique namevar for iptables::open. We would also be able to do things like initialise an array of users with different metadata parameters (eg, their full names pulled form LDAP) -- You have received this notification because you have either subscribed to it, or are involved in it. To change your notification preferences, please click here: http://projects.puppetlabs.com/my/account -- You received this message because you are subscribed to the Google Groups "Puppet Bugs" group. To unsubscribe from this group and stop receiving emails from it, send an email to puppet-bugs+unsubscr...@googlegroups.com. To post to this group, send email to puppet-bugs@googlegroups.com. Visit this group at http://groups.google.com/group/puppet-bugs?hl=en. For more options, visit https://groups.google.com/groups/opt_out.