tests "paren term thing a(d m) a d m "more paren term things let life(happen) let (life happen) let life:happen "treat colons as colons even if there's a space ne ne : ne (ne (ne ne)) "central feature about terms alone on their lines not being in a list a b c a b c "head linecontent list doesn't open onto the indental if cond then else ((if cond) then else) "a closed list will not take on more entries (only) then else ((only) then else) "invoked string a b"s (a (b s)) "escaped chars can occur in the middle of unquoted atoms. Yes it was weird that you did it the other way. The intuition driving this is=> If there are no spaces a person should just be able to remove the quotes and the string should mean the same thing. h\"ow "h\"ow" " h"ow "finalize the multiline string's newline only after finding another line matching the indent given. Only newline if the indent goes all the way up. m " something (m "something\n") "and if there's no newline m " something (m something) "newline without equivalent indent should *not* produce a newline m " something (m something) ":mindnt-punctuated multiline string m " something something (m "something\n\nsomething\n") "false initial multiline a m " n o l (a (m "") (n o) l) "function after colon a b:c(d) d (a (b (c d)) d) "many open parens - A(B(C(D(E N(M(E - (A (B (C (D E)))) (N (M E)) "colon interrupted by closing paren (a b:) (a (b)) "trailing colon a b: c a (b c) a b:c "non trailing colon a b :c a (b c) "trailing paren A B(C D (A (B C D)) "nested trailing parens A (B F (C D E (A (B F (C D E))) "escaped char quoted or not "A\"a" string A\"a string "chained colons, uhhh A:B:C:D:E (A (B (C (D E)))) "indent does not create empty lists a b c a b c failing "double colon" " a:: c "colon at beginning of scope" " :b " b(: c) " : a d " a bios () : so