[erlang-questions] Versioned variable names

David Mercer <>
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:  [mailto:] 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