Low level in implementation, meaning a representation that matches the native hardware data, code and storage conventions.
The advantage being hardware-level representations are the easiest to optimize for that hardware.
But also mathematically, where low level means simplest and fewest primitive abstractions that allow easy representation and manipulation of code and data. LISP's paired references and symbolic linking are very low level in that sense.
The advantage here is that with so few abstractions, code and data relationships are easy to define, analyze, transform, as well as evaluate.
And small numbers of simple abstractions are very easy to implement. As you obviously know from experience.
I have also created several little LISPs in aid of other projects.
Another language I have recreated opportunistically is FORTH. It can be viewed as a trade off between being low-level with respect to hardware, and in terms of simple abstractions. Not as flexible as LISP, but more efficient on typical hardware. Its basic abstractions consists of two dynamic lists. The first, a stream (a running list) of instructions that manipulate data on the second, a stack (a dynamic list we append and remove items from). And symbols for linking.
Yes, I know what you mean. I'm reading McCarthy's original paper now and what I'm noticing is that not all of it is low level in the second sense. For example, mathematically cond would be implemented with copairing/matching over left- and right-injections. Coproduct is the dual category to the product category that pairs belong to, so would be more natural than the higher-level cond, but much less efficient in practice.
Low level in implementation, meaning a representation that matches the native hardware data, code and storage conventions.
The advantage being hardware-level representations are the easiest to optimize for that hardware.
But also mathematically, where low level means simplest and fewest primitive abstractions that allow easy representation and manipulation of code and data. LISP's paired references and symbolic linking are very low level in that sense.
The advantage here is that with so few abstractions, code and data relationships are easy to define, analyze, transform, as well as evaluate.
And small numbers of simple abstractions are very easy to implement. As you obviously know from experience.
I have also created several little LISPs in aid of other projects.
Another language I have recreated opportunistically is FORTH. It can be viewed as a trade off between being low-level with respect to hardware, and in terms of simple abstractions. Not as flexible as LISP, but more efficient on typical hardware. Its basic abstractions consists of two dynamic lists. The first, a stream (a running list) of instructions that manipulate data on the second, a stack (a dynamic list we append and remove items from). And symbols for linking.