Shogoth -> Shoggoth
This commit is contained in:
parent
b4005b3b6d
commit
0ffc6c6bb7
26 changed files with 36 additions and 36 deletions
|
@ -1,6 +1,6 @@
|
||||||
py_project(
|
py_project(
|
||||||
name = "shogoth",
|
name = "shoggoth",
|
||||||
main = "src/python/shogoth/repl/__main__.py",
|
main = "src/python/forerunner/repl/__main__.py",
|
||||||
main_deps = [
|
main_deps = [
|
||||||
py_requirement("prompt_toolkit"),
|
py_requirement("prompt_toolkit"),
|
||||||
py_requirement("yaspin"),
|
py_requirement("yaspin"),
|
|
@ -1,4 +1,4 @@
|
||||||
# Shogot'im
|
# Shoggot'im
|
||||||
|
|
||||||
> "The shoggot'im, they're called: servitors. There are several kinds of advanced robotic systems made out of molecular components: they can change shape, restructure material at the atomic level -- act like corrosive acid, or secrete diamonds. Some of them are like a tenuous mist -- what Doctor Drexler at MIT calls a utility fog -- while others are more like an oily globule. Apparently they may be able to manufacture more of themselves, but they're not really alive in any meaning of the term we're familiar with. They're programmable, like robots, using a command language deduced from recovered records of the forerunners who left them here. The Molotov Raid of 1930 brought back a large consignment of them; all we have to go on are the scraps they missed, and reports by the Antarctic Survey. Professor Liebkunst's files in particular are most frustrating --''
|
> "The shoggot'im, they're called: servitors. There are several kinds of advanced robotic systems made out of molecular components: they can change shape, restructure material at the atomic level -- act like corrosive acid, or secrete diamonds. Some of them are like a tenuous mist -- what Doctor Drexler at MIT calls a utility fog -- while others are more like an oily globule. Apparently they may be able to manufacture more of themselves, but they're not really alive in any meaning of the term we're familiar with. They're programmable, like robots, using a command language deduced from recovered records of the forerunners who left them here. The Molotov Raid of 1930 brought back a large consignment of them; all we have to go on are the scraps they missed, and reports by the Antarctic Survey. Professor Liebkunst's files in particular are most frustrating --''
|
||||||
>
|
>
|
|
@ -6,7 +6,7 @@ from abc import ABC
|
||||||
from dataclasses import dataclass
|
from dataclasses import dataclass
|
||||||
import typing as t
|
import typing as t
|
||||||
|
|
||||||
from shogoth.types import (
|
from shoggoth.types import (
|
||||||
Keyword,
|
Keyword,
|
||||||
List,
|
List,
|
||||||
Symbol,
|
Symbol,
|
||||||
|
@ -84,7 +84,7 @@ class FnExpr(Expr):
|
||||||
body: Expr
|
body: Expr
|
||||||
|
|
||||||
|
|
||||||
BOOTSTRAP = "lang.shogoth.v0.bootstrap"
|
BOOTSTRAP = "lang.shoggoth.v0.bootstrap"
|
||||||
SPECIALS = Namespace(Symbol(BOOTSTRAP), {
|
SPECIALS = Namespace(Symbol(BOOTSTRAP), {
|
||||||
Symbol("if*"): None,
|
Symbol("if*"): None,
|
||||||
Symbol("let*"): None,
|
Symbol("let*"): None,
|
||||||
|
@ -92,7 +92,7 @@ SPECIALS = Namespace(Symbol(BOOTSTRAP), {
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
GLOBALS = Namespace(Symbol("lang.shogoth.v0.core"), {
|
GLOBALS = Namespace(Symbol("lang.shoggoth.v0.core"), {
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
6
projects/shoggoth/src/python/shoggoth/parser/__init__.py
Normal file
6
projects/shoggoth/src/python/shoggoth/parser/__init__.py
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
"""Published interface to the shoggoth parser."""
|
||||||
|
|
||||||
|
from .impl import parse
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = ["parse"]
|
|
@ -60,6 +60,6 @@ COMMENT: /;.*?\n/
|
||||||
|
|
||||||
|
|
||||||
def parse(input: str) -> Any:
|
def parse(input: str) -> Any:
|
||||||
'''Parse a string using the shogoth (lisp) gramar, returning an unmodified tree.'''
|
'''Parse a string using the shoggoth (lisp) gramar, returning an unmodified tree.'''
|
||||||
|
|
||||||
return PARSER.parse(input)
|
return PARSER.parse(input)
|
|
@ -1,6 +1,6 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
"""The shogoth reader."""
|
"""The shoggoth reader."""
|
||||||
|
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
@ -11,8 +11,8 @@ import re
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from lark import Token, Tree
|
from lark import Token, Tree
|
||||||
from shogoth.parser import parse
|
from shoggoth.parser import parse
|
||||||
from shogoth.types import (
|
from shoggoth.types import (
|
||||||
Keyword,
|
Keyword,
|
||||||
List,
|
List,
|
||||||
Symbol,
|
Symbol,
|
|
@ -3,14 +3,14 @@
|
||||||
from prompt_toolkit import PromptSession
|
from prompt_toolkit import PromptSession
|
||||||
from prompt_toolkit.history import FileHistory
|
from prompt_toolkit.history import FileHistory
|
||||||
from prompt_toolkit.styles import Style
|
from prompt_toolkit.styles import Style
|
||||||
from shogoth.analyzer import (
|
from shoggoth.analyzer import (
|
||||||
Analyzer,
|
Analyzer,
|
||||||
GLOBALS,
|
GLOBALS,
|
||||||
Namespace,
|
Namespace,
|
||||||
SPECIALS,
|
SPECIALS,
|
||||||
)
|
)
|
||||||
from shogoth.reader import Reader
|
from shoggoth.reader import Reader
|
||||||
from shogoth.types import Symbol
|
from shoggoth.types import Symbol
|
||||||
from yaspin import Spinner, yaspin
|
from yaspin import Spinner, yaspin
|
||||||
|
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ def main():
|
||||||
analyzer = Analyzer(SPECIALS, GLOBALS)
|
analyzer = Analyzer(SPECIALS, GLOBALS)
|
||||||
ns = Namespace(Symbol("user"), {})
|
ns = Namespace(Symbol("user"), {})
|
||||||
|
|
||||||
session = PromptSession(history=FileHistory(".shogoth.history"))
|
session = PromptSession(history=FileHistory(".shoggoth.history"))
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
try:
|
try:
|
|
@ -1,4 +1,4 @@
|
||||||
"""The public interface for shogoth's baked-in types."""
|
"""The public interface for shoggoth's baked-in types."""
|
||||||
|
|
||||||
|
|
||||||
import typing as t
|
import typing as t
|
|
@ -6,13 +6,13 @@ Hopefully no "real" interpreter ever uses this code, since it's obviously replac
|
||||||
|
|
||||||
from .isa import Module, Opcode
|
from .isa import Module, Opcode
|
||||||
|
|
||||||
from shogoth.types import *
|
from shoggoth.types import *
|
||||||
|
|
||||||
|
|
||||||
BOOTSTRAP = Module()
|
BOOTSTRAP = Module()
|
||||||
|
|
||||||
NOT = BOOTSTRAP.define_function(
|
NOT = BOOTSTRAP.define_function(
|
||||||
";/lang/shogoth/v0/bootstrap/not;bool;bool",
|
";/lang/shoggoth/v0/bootstrap/not;bool;bool",
|
||||||
[
|
[
|
||||||
Opcode.IF(target=3),
|
Opcode.IF(target=3),
|
||||||
Opcode.FALSE(),
|
Opcode.FALSE(),
|
||||||
|
@ -23,7 +23,7 @@ NOT = BOOTSTRAP.define_function(
|
||||||
)
|
)
|
||||||
|
|
||||||
OR = BOOTSTRAP.define_function(
|
OR = BOOTSTRAP.define_function(
|
||||||
";/lang/shogoth/v0/bootstrap/or;bool,bool;bool",
|
";/lang/shoggoth/v0/bootstrap/or;bool,bool;bool",
|
||||||
[
|
[
|
||||||
Opcode.IF(target=3),
|
Opcode.IF(target=3),
|
||||||
Opcode.TRUE(),
|
Opcode.TRUE(),
|
||||||
|
@ -37,7 +37,7 @@ OR = BOOTSTRAP.define_function(
|
||||||
)
|
)
|
||||||
|
|
||||||
AND = BOOTSTRAP.define_function(
|
AND = BOOTSTRAP.define_function(
|
||||||
";/lang/shogoth/v0/bootstrap/and;bool,bool;bool",
|
";/lang/shoggoth/v0/bootstrap/and;bool,bool;bool",
|
||||||
[
|
[
|
||||||
Opcode.IF(target=3),
|
Opcode.IF(target=3),
|
||||||
Opcode.IF(target=3),
|
Opcode.IF(target=3),
|
||||||
|
@ -50,7 +50,7 @@ AND = BOOTSTRAP.define_function(
|
||||||
)
|
)
|
||||||
|
|
||||||
XOR = BOOTSTRAP.define_function(
|
XOR = BOOTSTRAP.define_function(
|
||||||
";/lang/shogoth/v0/bootstrap/xor;bool,bool;bool",
|
";/lang/shoggoth/v0/bootstrap/xor;bool,bool;bool",
|
||||||
[
|
[
|
||||||
Opcode.DUP(nargs=2),
|
Opcode.DUP(nargs=2),
|
||||||
# !A && B
|
# !A && B
|
||||||
|
@ -73,16 +73,16 @@ XOR = BOOTSTRAP.define_function(
|
||||||
)
|
)
|
||||||
|
|
||||||
TRUE = BOOTSTRAP.define_type(
|
TRUE = BOOTSTRAP.define_type(
|
||||||
"/lang/shogoth/v0/true",
|
"/lang/shoggoth/v0/true",
|
||||||
ProductExpr([]),
|
ProductExpr([]),
|
||||||
)
|
)
|
||||||
|
|
||||||
FALSE = BOOTSTRAP.define_type(
|
FALSE = BOOTSTRAP.define_type(
|
||||||
"/lang/shogoth/v0/false",
|
"/lang/shoggoth/v0/false",
|
||||||
ProductExpr([]),
|
ProductExpr([]),
|
||||||
)
|
)
|
||||||
|
|
||||||
BOOL = BOOTSTRAP.define_type(
|
BOOL = BOOTSTRAP.define_type(
|
||||||
"/lang/shogoth/v0/bool",
|
"/lang/shoggoth/v0/bool",
|
||||||
SumExpr([TRUE, FALSE])
|
SumExpr([TRUE, FALSE])
|
||||||
)
|
)
|
|
@ -2,8 +2,8 @@
|
||||||
|
|
||||||
"""The Shogoth VM implementation.
|
"""The Shogoth VM implementation.
|
||||||
|
|
||||||
The whole point of shogoth is that program executions are checkpointable and restartable. This requires that rather than
|
The whole point of shoggoth is that program executions are checkpointable and restartable. This requires that rather than
|
||||||
using a traditional recursive interpreter which is difficult to snapshot, interpretation in shogoth occur within a
|
using a traditional recursive interpreter which is difficult to snapshot, interpretation in shoggoth occur within a
|
||||||
context (a virtual machine) which DOES have an easily introspected and serialized representation.
|
context (a virtual machine) which DOES have an easily introspected and serialized representation.
|
||||||
|
|
||||||
## The Shogoth VM Architecture
|
## The Shogoth VM Architecture
|
|
@ -3,7 +3,7 @@
|
||||||
|
|
||||||
from typing import NamedTuple
|
from typing import NamedTuple
|
||||||
|
|
||||||
from shogoth.types import FunctionRef
|
from shoggoth.types import FunctionRef
|
||||||
|
|
||||||
|
|
||||||
class Opcode:
|
class Opcode:
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from shogoth.parser import parse
|
from shoggoth.parser import parse
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("example", [
|
@pytest.mark.parametrize("example", [
|
|
@ -1,7 +1,7 @@
|
||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from shogoth.vm import *
|
from shoggoth.vm import *
|
||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
|
@ -3,7 +3,7 @@
|
||||||
from .fixtures import * # noqa
|
from .fixtures import * # noqa
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from shogoth.vm import *
|
from shoggoth.vm import *
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.parametrize("stack,ret", [
|
@pytest.mark.parametrize("stack,ret", [
|
|
@ -5,7 +5,7 @@ Tests coverign the VM interpreter
|
||||||
from .fixtures import * # noqa
|
from .fixtures import * # noqa
|
||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
from shogoth.vm import *
|
from shoggoth.vm import *
|
||||||
|
|
||||||
|
|
||||||
def test_true(vm):
|
def test_true(vm):
|
|
@ -1,6 +0,0 @@
|
||||||
"""Published interface to the shogoth parser."""
|
|
||||||
|
|
||||||
from .impl import parse
|
|
||||||
|
|
||||||
|
|
||||||
__all__ = ["parse"]
|
|
Loading…
Reference in a new issue