FWIW – putting to one side the question of whether or not this is a good idea – it would be possible to do this without new language syntax. However, you'd have to either pass a type hint or be explicit about the variables you want:
e.g. function tick(state::SvfSinOsc, coef::SvfSinOscCoef) @with state::SvfSinOsc, coef::SvfSinOsc # or @with state (ic1eq, ic2eq) coef (g0, g1) lv1 = g0*ic1eq - g1*ic2eq lv2 = g1*ic1eq + g0*ic2eq SvfSinOsc(2*v1 - ic1eq, 2*v2 - ic2eq) end This would work in the non-mutating case by calling names() on the type and making appropriate variable declarations. You could then go further and implement function tick(state::SvfSinOsc, coef::SvfSinOscCoef) @with state (ic1eq, ic2eq) coef (g0, g1) begin lv1 = g0*ic1eq - g1*ic2eq lv2 = g1*ic1eq + g0*ic2eq SvfSinOsc(2*v1 - ic1eq, 2*v2 - ic2eq) end end Which would walk over the expression, replacing `a` with `Foo.a`. However, it would be tricky to implement this correctly since you'd have to be aware of variable scoping within the expression. I may implement the non-mutating version of this at some point – it seems like it could be useful. On Thursday, 12 June 2014 08:21:42 UTC+1, Andrew Simper wrote: > > On Thursday, June 12, 2014 2:16:30 PM UTC+8, Andrew Simper wrote: >> >> It seems that the local keyword is a bit of a language kludge to me, >> since it is implied in most cases, apart from stating the new scope in the >> form of a for loop etc. It would seem more natural and consistent to me to >> add the local keyword in front of all variables you want to be local in >> scope, and everyting else is global. This line of reasoning I'm sure has >> already been argued to death, and obviously having an implicit local was >> decided to be best. >> > > Having the local keyword like it is makes most sense to me, but I suppose > it isn't a big deal to me that if you don't explicitly specify local you > could be referring to something outside the current scope, which is the > case with for loops. >