The early part of the CosmicOS message describes a programming language that consists only of integers and nesting markers (parentheses). Symbols are allowed for convenience when developing the message, but get stripped away. For example:
(= 20 (+ 5 15))
is encoded exactly the same way as:
(2 20 (10 5 15))
This is done to cut down on ambiguity and complexity once we get
to meta-programming. Instead of a special syntax, we agree
that the first integer in any list is a look-up to some kind of
memory. Currently, slot 2
holds a function for
testing equality and slot 10
holds a function for adding two integers.
The memory store is important to the message, but the specific locations used are not. So far, they get assigned on need, and then are pinned down so that the message doesn’t change unnecessarily from build to build. This means that commonly used stuff is held in lower-index locations, leading to a shorter message overall.
On balance, I like not having
a special syntax for identifiers versus integers
(although I’m not religious about it)
since it
avoids a lot of complexity once we are describing
how to evaluate code within the message itself. I do
have a qualm though. It would perhaps be better to use
higher-index locations (like say 345391
) and avoid lower locations
(like 10
or 2
),
as a courtesy to the eventual reader, so that in the
early message there are no collisions between uses of
integers as simple numbers and uses of integers as memory
indices. When (+ 5 15)
is encoded as (10 5 15)
there isn’t much contrast
between the lookup and the arguments. If instead we
encoded as (345391 5 15)
, there would be a bigger contrast.
And context-free searching for a sequence
like 345391
in the message would yield relevant
hits, rather than the chaff that a search for 10
or 2
would give.
The message would become longer, but could be simpler to understand. Expect this change in a future revision to CosmicOS.