2022-04-12 07:49:12 +00:00
|
|
|
"""Shogoth bootstrap code.
|
|
|
|
|
|
|
|
Some utterly trivial functions and types that allow me to begin testing the VM.
|
|
|
|
Hopefully no "real" interpreter ever uses this code, since it's obviously replaceable.
|
|
|
|
"""
|
|
|
|
|
|
|
|
from .isa import Module, Opcode
|
2022-05-31 15:41:10 +00:00
|
|
|
|
2022-06-01 01:25:18 +00:00
|
|
|
from .typing import ProductExpr, SumExpr
|
2022-04-12 07:49:12 +00:00
|
|
|
|
2022-05-31 15:41:10 +00:00
|
|
|
|
2022-04-12 07:49:12 +00:00
|
|
|
BOOTSTRAP = Module()
|
|
|
|
|
|
|
|
NOT = BOOTSTRAP.define_function(
|
2022-06-01 01:04:14 +00:00
|
|
|
";/lang/shoggoth/v0/bootstrap/not;bool;bool",
|
2022-04-12 07:49:12 +00:00
|
|
|
[
|
|
|
|
Opcode.IF(target=3),
|
|
|
|
Opcode.FALSE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
OR = BOOTSTRAP.define_function(
|
2022-06-01 01:04:14 +00:00
|
|
|
";/lang/shoggoth/v0/bootstrap/or;bool,bool;bool",
|
2022-04-12 07:49:12 +00:00
|
|
|
[
|
|
|
|
Opcode.IF(target=3),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
Opcode.IF(target=6),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
Opcode.FALSE(),
|
|
|
|
Opcode.RETURN(1)
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
AND = BOOTSTRAP.define_function(
|
2022-06-01 01:04:14 +00:00
|
|
|
";/lang/shoggoth/v0/bootstrap/and;bool,bool;bool",
|
2022-04-12 07:49:12 +00:00
|
|
|
[
|
|
|
|
Opcode.IF(target=3),
|
|
|
|
Opcode.IF(target=3),
|
|
|
|
Opcode.GOTO(target=5),
|
|
|
|
Opcode.FALSE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
],
|
|
|
|
)
|
|
|
|
|
|
|
|
XOR = BOOTSTRAP.define_function(
|
2022-06-01 01:04:14 +00:00
|
|
|
";/lang/shoggoth/v0/bootstrap/xor;bool,bool;bool",
|
2022-04-12 07:49:12 +00:00
|
|
|
[
|
|
|
|
Opcode.DUP(nargs=2),
|
|
|
|
# !A && B
|
2022-04-21 06:17:59 +00:00
|
|
|
Opcode.CALLS(NOT),
|
|
|
|
Opcode.CALLS(AND),
|
2022-04-12 07:49:12 +00:00
|
|
|
Opcode.IF(target=6),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
# !B && A
|
|
|
|
Opcode.ROT(2),
|
2022-04-21 06:17:59 +00:00
|
|
|
Opcode.CALLS(NOT),
|
|
|
|
Opcode.CALLS(AND),
|
2022-04-12 07:49:12 +00:00
|
|
|
Opcode.IF(target=12),
|
|
|
|
Opcode.TRUE(),
|
|
|
|
Opcode.RETURN(1),
|
|
|
|
Opcode.FALSE(),
|
2022-04-21 06:17:59 +00:00
|
|
|
|
2022-04-12 07:49:12 +00:00
|
|
|
Opcode.RETURN(1),
|
|
|
|
],
|
|
|
|
)
|
2022-04-21 06:17:59 +00:00
|
|
|
|
|
|
|
TRUE = BOOTSTRAP.define_type(
|
2022-06-01 01:04:14 +00:00
|
|
|
"/lang/shoggoth/v0/true",
|
2022-05-12 06:21:22 +00:00
|
|
|
ProductExpr([]),
|
2022-04-21 06:17:59 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
FALSE = BOOTSTRAP.define_type(
|
2022-06-01 01:04:14 +00:00
|
|
|
"/lang/shoggoth/v0/false",
|
2022-05-12 06:21:22 +00:00
|
|
|
ProductExpr([]),
|
2022-04-21 06:17:59 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
BOOL = BOOTSTRAP.define_type(
|
2022-06-01 01:04:14 +00:00
|
|
|
"/lang/shoggoth/v0/bool",
|
2022-05-12 06:21:22 +00:00
|
|
|
SumExpr([TRUE, FALSE])
|
2022-04-21 06:17:59 +00:00
|
|
|
)
|