lambda-calc-1/notes.md
2025-01-13 20:36:07 -06:00

2.2 KiB

I want a command-line interpreter with optional echo and rainbow parenthessis. I want to read from a file, printing what was read and then the result.

I want 'define' or 'def' or some symbol creates a new global namespace/envronment that falls back to the previous.

// this is mostly a neat calculator

// let's also read an .13rc init file. There's a command-line option not to.

// main will be a parse, eval, print and free loop.

// I want to be able to change things interactively // using extra syntax not allowed in the files?

// I want a good interactive prompt: // colors // syntax errors

// in order to get that, the tokenizer will have to hand out token objects
that are assigned colors?

// the parser will also have to gracefully handle syntax errors, by creating
'syntax error' expressions

// main will have to scan for these? and partially color things that make
sense and give a message for the rest?

// reading from a file will be senstive to newlines. newlines end a statement.
that is, a statement is ended with a newline only if the statement would
validily parse ending where it is. otherwise, ignore the newline. // semicolons delimit multiple statements on the same line.

// a b c => (a(b))(c)

// a lambda: b c // a(lambda: b c) // (a(lambda: b))(c)

// lambda x: x 4

// lambda x: x (lambda y: y)

// (lambda x: x) 4

// lambda n: lambda f: lambda x: f (n f x) // lambda n: (lambda f: (lambda x: f((n(f))(x))))

// a b c d e // (((a(b))(c))(d))(e)

primary-expression
    : variable-name // use of variable
    | integer-literal // literal
    | '(' root-expression ')' // higher operator preceidence
    ;

abstraction: ('lambda' | 'λ') (variable-name (',' variable-name)*)? (':' | '.') postfix-expression;

postfix-expression
    : primary-expression
    | postfix-expression primary-expression // function call
    | postfix-expression abstraction // function call passing in a function declaration
    ;

lambda-expression
    : postfix-expression
    | abstraction
    ;

root-expression: lambda-expression;

expression: root-expression;

statement: (variable-name '=')* expression;

statements: statement (';' statement)* ';'?;

%start: statements;