Pulling Ourselves Up By Our Bootstraps
Pulling Ourselves Up By Our Bootstraps
Previous | Top | Next |
---|---|---|
But Why Would You Even Do This? | Pulling Ourselves Up By Our Bootstraps | Pulling Some Strings |
Encoding The Basic Data Types
Using only the characters in our close-to-minimal alphabet, we can immediately represent two basic JavaScript objects:
[]
The empty list, and{}
The empty object
By performing different combinations of type coercion on these simple values, we can derive the primitive Boolean values of true
and false
; from which we can then derive the integer values 0
and 1
.
Primitive Values
By performing numeric coercion on an empty list, we obtain integer 0
By performing Boolean coercion on an empty list, we obtain the Boolean primitive false
If we then perform Boolean negation on ![]
we obtain true
Finally, we can derive integer 1
by performing numeric coercion on !![]
Counting Numbers
We have seen above that when a Boolean value appears in an arithmetic expression, false
is coerced to 0
and true
is coerced to 1
.
Knowing this we can now derive the counting numbers.
Since 2
is 1 + 1
, we can rewrite 1 + 1
as true + true
and still get 2
.
Further, we know from above that true
can be encoded as !![]
; therefore 1 + 1
can be rewritten as:
So now we can generate the first 10 counting numbers:
+[] // 0
+!![] // 1
!![] + !![] // 2
!![] + !![] + !![] // 3
!![] + !![] + !![] + !![] // 4
!![] + !![] + !![] + !![] + !![] // 5
!![] + !![] + !![] + !![] + !![] + !![] // 6
!![] + !![] + !![] + !![] + !![] + !![] + !![] // 7
!![] + !![] + !![] + !![] + !![] + !![] + !![] + !![] // 8
!![] + !![] + !![] + !![] + !![] + !![] + !![] + !![] + !![] // 9