Using a metacircular interpreter for lispy languages - one that implements the same language it’s written in, allows you to skip the often tedious parsing step by using the host’s read to give you a syntax tree, letting you skip to the interesting bits of manipulating and transforming that tree and executing it (eval-apply in sicp terminology). Those bits are foundational stuff for writing an interpreter or compiler for any language, which lots of people find to be interesting projects.
allows you to skip the often tedious parsing step by using the host’s read
READ mostly gives a tree of tokens. This makes it a form of a tokenizer. After we call READ we don’t know what the tokens mean: is FOO a variable, a macro, a function, a built-in special form, a type, … This can only be determined by interpreting/compiling the token tree.
Using a metacircular interpreter for lispy languages - one that implements the same language it’s written in, allows you to skip the often tedious parsing step by using the host’s
read
to give you a syntax tree, letting you skip to the interesting bits of manipulating and transforming that tree and executing it (eval-apply in sicp terminology). Those bits are foundational stuff for writing an interpreter or compiler for any language, which lots of people find to be interesting projects.I meant what is so universal for all languages? People say that eval-apply loop is the core of every language.
READ mostly gives a tree of tokens. This makes it a form of a tokenizer. After we call READ we don’t know what the tokens mean: is FOO a variable, a macro, a function, a built-in special form, a type, … This can only be determined by interpreting/compiling the token tree.