new syntax - a provocation

Richard A. O'Keefe <>
Tue Sep 23 07:59:50 CEST 2003


"Vlad Dumitrescu" <> wrote:
	* I have found myself wishing to be able to build data structures other than
	tuples or lists, in the same elegant way as tuples and lists, directly in
	the code. The most acute need was for bitsets/integer sets, where using the
	binary syntax is very cumbersome when there are many such sets to be
	declared. It would be super-nice to be able to write something like
	    #[0011010001]
	or
	    &[3, 45, 27, 39],
	where the first is a bit representation, and the latter a set containing the
	specified integers. The implementation would be as binaries, so just the
	syntax is new.
	
If we want to construct values of such types at run time, there had
better be a function which can convert a list of run time values.
Suppose it is
    bitset([X,Y,Z,W]) -> a binary with bits X, Y, Z, and W set (all >= 0).
Then the only syntax you need is
    bitset([3,45,27,39])
*except* that you might want to use it in pattern matches and guards.

All it takes is a declaration.  For argument's sake,

    -import_literal(my_stuff, [bitset/1]).

with the interpretation

(A) "Do the same as -import with the same arguments"
AND
(B) "Quit compiling now if the module is not loaded into the compiler"
AND
(C) "working from the leaves of the parse tree to the root,
     whenever you see a call to a literal import function with
     constant arguments, call the function and use the value it
     returns."
AND
(D) "if there is a call to such a function in a pattern or guard which
     is _not_ resolved at compile time, provide an intelligible error
     message and reject the module."

This could be prototyped using a transformation module, but
- it is the smallest change to Erlang syntax I can think of that would
  achieve the goal
- it requires the least change to Erlang-processing tools such as
  editor modes
- it completely solves the specified problem
- it doesn't require new token-level syntax
- it makes the link to the module that provides the conversion explicit
- lots of other good stuff.

	
	* Having come this far, and remembering Tobbe's (I think) call for Erlang2,
	and also Luke's Lisp parallels, there is one more small step to take, for
	those that like to play on the edge: Why not replace the whole Erlang syntax
	to a more Lispy one?

I have found that a Haskell-like syntax for Erlang would fairly consistently
yield modules with only 5/8 as many SLOC.  I'm a Lisp fan, implementor, and
user from way back, but in this case it's exactly the opposite of the right
direction.

Lisp doesn't get its power from its *concrete* syntax but from its
*abstract* syntax.




More information about the erlang-questions mailing list