The philosophy of the Andl language includes the following considerations.
- Consistent use of syntax. Things that do similar things should look similar, and vice versa.
- Functional in style (not procedural or OO). A language of expressions with (almost) no side-effects, which can support either lazy or eager evaluation. Everything that looks like a value could actually be an expression.
- Lexical scoping. Predefined->catalog(s)->argument(s)->current tuple(s)->local. No scope resolution operators, just renaming and aliases. Scoping reads left-to-right, consistent with infix notation.
- Few or no reserved words. System library functions have names, but can always be overridden by user definitions.
- Not too many arcane symbols. They just take too much explaining.
- Lexical: any legal characters are permitted in an identifier and any legal characters can be used to construct a literal character string (but control characters are not recognised). Strings concatenate. Special quoting conventions for identifiers, Unicode strings, time literals.
- Types: the native abstract types are logical, number, character, time and binary. All SQL types are accepted, but are converted accordingly.
- The compiler is hand-coded LL(1+), recursive descent, which limits certain kinds of syntax. Shouldn’t be a problem in practice. The grammar is quite small.