% testing for the erlang syntax highlighter
% NOTE alerts work in comments to TODO !

% pragmas (show as keywords)
-module
-export
-define
-undef
-ifdef
-ifndef
-else
-endif
-include
-include_lib

% key words
after begin case catch cond  end fun if let of query receive all_true some_true 

% operators
div rem or xor bor bxor bsl bsr and band not bnot
+ - * / == /= =:= =/= < =< > >= ++ -- = ! <-

% separators (show as functions)
( ) { } [ ] . : | || ; , ? -> #

% functions - predefined (part of erlang module) - show as functions
abs accept alarm apply atom_to_list binary_to_list binary_to_term check_process_code
concat_binary date delete_module disconnect_node element erase exit float float_to_list
garbage_collect get get_keys group_leader halt hd integer_to_list is_alive is_atom is_binary
is_boolean is_float is_function is_integer is_list is_number is_pid is_port is_process_alive
is_record is_reference is_tuple length link list_to_atom list_to_binary list_to_float list_to_integer
list_to_pid list_to_tuple load_module loaded localtime make_ref module_loaded node nodes now
open_port pid_to_list port_close port_command port_connect port_control ports pre_loaded process_flag
process_info processes purge_module put register registered round self setelement size
spawn spawn_link spawn_opt split_binary statistics term_to_binary throw time tl trunc tuple_to_list
unlink unregister whereis

% functions - inferred
module:function
function()

% atoms (show as "char")
% begin with underscore, lowercase, contain numbers letters and @ - or anything between ''
middle_underscore
abc ab4d a@cd8 a@
'And this is (\012) an atom \' Atoo' Variable 'atom again' 

% variables (begin with capital letter or underscore, contain numbers, letters and @)
_leadingUnderscore AbdD@ B45@c

% this is a string 
"a string sits between \" double quotes" atom "more string"

% integers (decimal)
1. 234 $A

% integers (specified base)
2#10101 34#567

% float
12.23 12.9e-67 12.8E+89 33.34e89

% and finally some real code, so we can see what it looks like...
-module(codetest).			% everything is in a module
-export([fac/1]).		% name and number of arguments - need this to be called outside of the module

fac(N) when N > 0  -> N * fac(N-1);
fac(N) when N == 0 -> 1.