Parsing ======= Elymas has a very simplistic parser (if at all). Parsing works as follows: * Spaces separate things. * If a `#` is encountered, ignore rest of line. This implements comments. * If a sequence of digits is encountered, this is an integer literal and gets pushed to the stack. * If something looks like a float, i.e. matches (\\d[0-9.]*([eE]-?\\d+)?), this is a float literal and gets pushed to the stack. * If a `"` is encountered, a string literal begins. Within a string, backslash escapes special characters. `\\` becomes single backslash, `\n` is a new line, `\r` is a carriage return, `\0` is the NUL character (all bits zero). All other (non-escaped) characters just become part of the string. * If a sequence of alphanumeric characters (a-zA-Z0-9) is encountered, it is looked up in the current scope. This is how normal functios like `dump` get referenced. * If a sequence of non-alphanumeric characters is encountered, it is looked up in the current scope. This is how functions like `_` work. * If a sequence starts with non-alphanumeric characters, but then an alphanumeric character is encountered, this latter part is converted to a string literal (backslash escapes do not apply) and pushed to the stack. Afterwards the non-alphanumeric prefix is looked up in the current scope. This is how `/abc` becomes `"abc"`: The string is created during parsing and afterwards the identity function is applied. Additionally, the parser has a quote-level counter which is increased by `{` and decreased by `}`. If the quote-level is non-zero, i.e. the parser is in quote mode, the resolution of names is postponed and a function object doing the resolution is pushed instead.