[erlang-questions] Versioned variable names
David Mercer
dmercer@REDACTED
Thu Jun 11 16:31:11 CEST 2009
For what it's worth, I enhanced my parsec_do transform to do something
similar. If this syntax is appealing to anyone, I use "<-" for
reassignment, and "=" can still be used for matching. Of course, you can
still have patterns on the LHS of the "<-" (e.g., "{ok, X} <- ..."), but any
variable will be reassigned rather than matched. Anyway, if you like this
syntax, I can make my transform public:
[ do:_ || MO <- re:replace(MO, "_", "-", [{return, list}, global])
, MO <- toupper(MO)
% Replace zeros
, MO <- re:replace(MO, "RX0", "RXO", [{return, list},
global])
% Insert hyphen if missing
, case re:run(MO, "-", [{capture, none}]) of
nomatch -> insert_hyphen(MO);
match -> MO
end
]
(Note that the underscore in "do:_" is because my parse transform allows
different functions to do the binding, so I'm using "_" to mean just
reassign variables, with no special functionality.)
Cheers,
David Mercer
> -----Original Message-----
> From: erlang-questions@REDACTED [mailto:erlang-questions@REDACTED] On
> Behalf Of Paul Mineiro
> Sent: Wednesday, June 10, 2009 6:23 PM
> To: erlang-questions
> Subject: Re: [erlang-questions] Versioned variable names
>
> fwiw, i cleaned this up so it could handle an arbitrary number of
> assignments, and released to google code.
>
> http://code.google.com/p/fwtemplates/downloads/list?can=2&q=lyet&colspec=F
> ilename+Summary+Uploaded+Size+DownloadCount
>
> the original example from the poster now looks like:
>
> ------
>
> MO5 = lyet:lyet(
> % Take away underscore and replace with hyphen
> MO = re:replace(MO, "_", "-", [{return, list}, global]),
> MO = toupper(MO),
> % Replace zeros
> MO = re:replace(MO, "RX0", "RXO", [{return, list}, global]),
> % Insert hyphen if missing
> case re:run(MO, "-", [{capture, none}]) of
> nomatch ->
> insert_hyphen(MO);
> match ->
> MO
> end
> ),
>
> ------
>
> cheers,
>
> -- p
>
> On Tue, 9 Jun 2009, Paul Mineiro wrote:
>
> > I took Ulf's ct_expand parse transform and modified it to provide let
> like
> > behaviour. Something like
> >
> > --------
> > -module (testlyt).
> > -compile ({ parse_transform, lyt }).
> > -compile (export_all).
> >
> > g (X) -> X + 1.
> > h (X) -> X + 2.
> > l (X) -> X + 3.
> > m (X) -> X + 4.
> >
> > f (X) -> lyt:lyt (X = g (X), begin
> > lyt:lyt (X = h (X), begin
> > lyt:lyt (X = l (X), begin
> > m (X)
> > end)
> > end)
> > end).
> > --------
> >
> > should work (let is a reserved keyword so i used lyt). It produces
> > output like:
> >
> > % erl -noshell -noinput -eval 'io:format ("~p~n", [ testlyt:f (1) ]).' -
> s
> > erlang halt
> > 11
> >
> > The transform is attached.
> >
> > Cheers,
> >
> > -- p
> >
> >
> > On Tue, 9 Jun 2009, Mikael Pettersson wrote:
> >
> > > Attila Rajmund Nohl writes:
> > > > Hello!
> > > >
> > > > I think there wasn't any grumbling this month about the immutable
> > > > local variables in Erlang, so here's real world code I've found
> just
> > > > today:
> > > >
> > > > % Take away underscore and replace with hyphen
> > > > MO1 = re:replace(MO, "_", "-", [{return, list}, global]),
> > > > MO2 = toupper(MO1),
> > > > % Replace zeros
> > > > MO3 = re:replace(MO2, "RX0", "RXO", [{return, list}, global]),
> > > > % Insert hyphen if missing
> > > > MO5 = case re:run(MO3, "-", [{capture, none}]) of
> > > > nomatch ->
> > > > insert_hyphen(MO3);
> > > > match ->
> > > > MO3
> > > > end,
> > > >
> > > > I think it's fairly clumsy to use MOx (MO for managed object) in
> the
> > > > code. MO4 was removed during the regexp->re refactoring step. How
> to
> > > > eliminate the versioned variable names? The
> > > > MOAfterUnderscoresWereReplaced, UpperCaseMO, MOAfterRX0WasReplaced,
> > > > etc. variablenames are really ugly. It used to use regexp, so at
> that
> > > > point it wasn't possible to easily nest the whole into one call,
> but
> > > > that would be still ugly. So any other ideas?
> > >
> > > This has nothing to do with mutable variables (values or
> > > bindings), and everything to do with Erlang's unorthodox
> > > (for a functional language) scoping rules and semantics
> > > for "Var = Expr".
> > >
> > > Languages using LET for local bindings tend to allow you
> > > to re-bind already-bound variables in nested scopes. For
> > > instance, in Standard ML I would often write:
> > >
> > > fun f (..) =
> > > let state = init()
> > > state = stage1(state)
> > > state = finish(state)
> > > in
> > > ... state ...
> > > end
> > >
> > > and similarly in Scheme using LET*.
> > >
> > > In Erlang you can't do this, so you're stuck with:
> > > - numbered variables (ugly but often reasonably practical)
> > > - function composition like f(x) -> a(b(c(x))), but that
> > > quickly gets unreadable
> > > - using a separate function for each stage and tailcall
> > > between the stages:
> > > f() -> g(init()).
> > > g(X) -> h(update(X)).
> > > h(X) ->
> > > NewX = if ... -> update2(X); true -> X end,
> > > i(NewX).
> > > i(X) ->
> > > this doesn't entirely eliminate the variable naming problem,
> > > but it does limit it to say two versions per function body,
> > > which is manageable (I use this approach quite a lot in the
> > > HiPE compiler backends when translating generic intermediate
> > > code to architecture specific code)
> > > - foldl (as another poster suggested), which is essentially
> > > equivalent to function composition or using tailcalls between
> > > per-stage functions, except it's expressed in different syntax
> > >
> > > ________________________________________________________________
> > > erlang-questions mailing list. See http://www.erlang.org/faq.html
> > > erlang-questions (at) erlang.org
> > >
> > >
> >
> > Well for these men if they succeed; well also, though not so well, if
> > they fail, given only that they have nobly ventured, and have put forth
> > all their heart and strength.
> >
> > -- Theodore Roosevelt
>
>
> ________________________________________________________________
> erlang-questions mailing list. See http://www.erlang.org/faq.html
> erlang-questions (at) erlang.org
More information about the erlang-questions
mailing list