1:- module(tidylog_atom_name, [name//1]).    2
    3% Define unquoted atom
    4
    5:- use_module(library(tidylog/common), [ when_generating//1
    6                                       , when_parsing//1
    7                                       ]).    8
    9name(A) -->
   10    when_generating(atom_codes(A,[Code|Codes])),
   11
   12    initial(Code),
   13    inner(Codes),
   14
   15    when_parsing(atom_codes(A,[Code|Codes])).
   16
   17
   18initial(C) -->
   19    [C],
   20    { initial_char(C) }.
   21
   22inner([C|Codes]) -->
   23    [C],
   24    { inner_char(C) },
   25    inner(Codes).
   26inner([]) -->
   27    [].
   28
   29
   30initial_char(C) :-
   31    between(0'a, 0'z, C).
   32
   33inner_char(C) :-
   34    C = 0'_;
   35    initial_char(C);
   36    between(0'0,0'9,C);
   37    between(0'A,0'Z,C)