This is a syntax much more like that used by mathematicians working on the λ calculus then and now.
We modify this syntax by
<Expression> ::= <ident> | (<appl>) | (λ<idents>.<appl>) | <digs> <idents> ::= <ident> | <idents><ident> <appl> ::= <Expression> | <appl><Expression> <digs> ::= <dig> | <digs><dig>The semantics no longer follows the syntax but we can say that (λabM) means what (λa(λbM)) means where ‘a’ is replaced by any <idents> and ‘b’ is replaced by any <ident>. The syntax almost allows (λ.M) which would mean the same as M. The compiler is mostly designed as if it were allowed. This syntax still requires the outermost parens in an application. We require (fa) where Church allows fa. This aids the REPL which would otherwise need a new signal from the user that he was ready for compilation to begin.
We exploit utf-8’s ample concept of letter and consider that any single uni-code code-point that is not space (0x20), line-feed (0x0A), or mentioned in the above syntax, is a valid <ident>. I don’t want to depend on some external changing definition of what code-points denote some notion of ‘letter’. (Well just now we allow the 52 latin letters in either case and the 1100 some characters of the Yi syllabary. The predicate let controls acceptance as <ident>. ((λꈤꈤ)48) -> 48). <dig> is one of the 10 digits 0x30 thru 0x39. Scheme style comments are allowed, consisting of a semicolon up to the next new-line. Spaces, new-lines and comments can be inserted anywhere but in numerals without changing the program meaning.
Church uses capital latin letters to denote valid expressions in his informal discussions of formal expressions. We may need a similar convention for a ‘define’ like scheme. We may also want some some form of expression that includes contents from another named file.