Hello all,

As I discussed with José on ElixirconfEU after my talk on the parser, I 
would like to add an option to the tokenizer to be able to still being able 
to parse Elixir code without creating atoms.

The solution would be to have a callback function as an option to the 
tokenizer (exposed through `Code.string_to_quoted/2`), that would get 
called in the event of the tokenizer encountering an unexisting atom. 
Instead of raising, a callback function could be called with the token and 
the tokenizer metadata. The callback function returns the data structure 
that would be put in the AST instead of the atom. For instance, like in my 
talk, an 'atom marker' {:":", "atomname"}.

The callback gets 4 arguments:
- atom name (string)
- file
- line
- column

The default behaviour of this function could be to raise an error, like the 
existing_atoms_only: true option does now. So two questions before I 
implement this:

1) How should we call this option? I was thinking of either one of these:
- nonexisting_atom_callback: 
- on_nonexisting_atom:

2) Should the callback function option be only applicable when 
existing_atoms_only: true is passed in as well? Or would it be like this:

Code.string_to_quoted(string_w_new_atoms) → normal behaviuor, creates atoms
Code.string_to_quoted(string_w_new_atoms, existing_atoms_only: true) → 
raises ("builtin" callback behaviour)
Code.string_to_quoted(string_w_new_atoms, nonexisting_atom_callback: 
&mycallback/4) → gets called

in the last case, existing_atoms_only: true is implicit.
However that creates a confusing situation when combining 
existing_atoms_only: false + nonexisting_atom_callback . So I prefer to be 
explicit:

Code.string_to_quoted(string_w_new_atoms, nonexisting_atom_callback: 
&mycallback/4) → raises RuntimeError 

Code.string_to_quoted(string_w_new_atoms, existing_atoms_only: true, 
nonexisting_atom_callback: &mycallback/4) → mycallback gets called


Arjan


-- 
You received this message because you are subscribed to the Google Groups 
"elixir-lang-core" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/elixir-lang-core/ac2699c7-af26-4b0d-9734-c385aa59aef2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to