From a52e5d3426c8e5693f90ecad27e8eacadfb75ee1 Mon Sep 17 00:00:00 2001 From: Sasha Koshka Date: Thu, 8 Sep 2022 14:43:19 -0400 Subject: [PATCH] Ran gofmt --- cmd/main.go | 1 + creature.go | 32 ++++++++++++------------- creature_test.go | 51 ++++++++++++++++++++-------------------- examples/echo.go | 21 ++++++++++------- examples/psychiatrist.go | 51 +++++++++++++++++++++------------------- 5 files changed, 81 insertions(+), 75 deletions(-) create mode 100644 cmd/main.go diff --git a/cmd/main.go b/cmd/main.go new file mode 100644 index 0000000..06ab7d0 --- /dev/null +++ b/cmd/main.go @@ -0,0 +1 @@ +package main diff --git a/creature.go b/creature.go index a90ef03..51faf09 100644 --- a/creature.go +++ b/creature.go @@ -2,15 +2,15 @@ package creature // Word is a type constraint defining possible word types for the Machine. type Word interface { - int8 | int16 | int32 | int64 | - uint8 | uint16 | uint32 | uint64 | - int | uint + int8 | int16 | int32 | int64 | + uint8 | uint16 | uint32 | uint64 | + int | uint } // Machine is a stack machine. It contains an array of integers as its program // data, and provides methods to run this program data, as well as interact with // it. -type Machine [WORD Word] struct { +type Machine[WORD Word] struct { program []WORD stack []WORD block []WORD @@ -22,7 +22,7 @@ type Machine [WORD Word] struct { // MachineFunction is a function that can extend the functionality of the stack // machine. It is passed a pointer to the machine that is calling it, and the // machine will halt execution if true is returned. -type MachineFunction [WORD Word] func(machine *Machine[WORD]) (stop bool) +type MachineFunction[WORD Word] func(machine *Machine[WORD]) (stop bool) // All supported opcodes const ( @@ -103,22 +103,22 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case ADD: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() machine.Push(left + right) case SUB: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() machine.Push(left - right) case MUL: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() machine.Push(left * right) case DIV: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() if right == 0 { err = ErrorDivideByZero return @@ -127,7 +127,7 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case EQ: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() equal := 0 if left == right { equal = 1 @@ -136,7 +136,7 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case GT: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() greater := 0 if left > right { greater = 1 @@ -145,7 +145,7 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case LT: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() less := 0 if left < right { less = 1 @@ -154,7 +154,7 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case NEQ: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() notEqual := 0 if left != right { notEqual = 1 @@ -163,7 +163,7 @@ func (machine *Machine[WORD]) Execute(offset WORD) (err error) { case MOD: right := machine.Pop() - left := machine.Pop() + left := machine.Pop() machine.Push(left % right) case HALT: @@ -228,7 +228,7 @@ func (machine *Machine[WORD]) Pop() (word WORD) { if int(machine.pointer) <= 0 || int(machine.pointer) >= len(machine.stack) { return } - + word = machine.stack[machine.pointer] machine.pointer-- @@ -259,7 +259,7 @@ func (machine *Machine[WORD]) Poke(address WORD, word WORD) { // Register registers a function at the specified ID. If there is already a // function registered at that ID, this method will return an error. -func (machine *Machine[WORD]) Register ( +func (machine *Machine[WORD]) Register( id WORD, function MachineFunction[WORD], ) ( diff --git a/creature_test.go b/creature_test.go index 9a54bbd..cee2d59 100644 --- a/creature_test.go +++ b/creature_test.go @@ -2,14 +2,14 @@ package creature import "testing" -func runMachineTest ( +func runMachineTest( program []int, - memory []int, + memory []int, test *testing.T, ) ( machine *Machine[int], ) { - machine = &Machine[int] {} + machine = &Machine[int]{} machine.LoadProgram(program) if memory != nil { machine.LoadMemory(memory) @@ -25,12 +25,12 @@ func runMachineTest ( } func TestPush(test *testing.T) { - machine := runMachineTest ([]int { + machine := runMachineTest([]int{ PUSH, 3, POP, PUSH, 654, }, nil, test) - + result := machine.Pop() test.Log("popped:", result) @@ -41,23 +41,23 @@ func TestPush(test *testing.T) { } func TestArithmetic(test *testing.T) { - machine := runMachineTest([]int { + machine := runMachineTest([]int{ PUSH, 3, PUSH, 2, ADD, - + PUSH, 10, PUSH, 4, SUB, - + PUSH, 2, PUSH, 7, MUL, - + PUSH, 12, PUSH, 3, DIV, - + PUSH, 8, PUSH, 6, MOD, @@ -102,23 +102,22 @@ func TestArithmetic(test *testing.T) { } func TestComparison(test *testing.T) { - machine := runMachineTest([]int { + machine := runMachineTest([]int{ PUSH, 6, PUSH, 6, EQ, - + PUSH, 324, PUSH, 4, GT, - + PUSH, 4, PUSH, 324, LT, - + PUSH, 54, PUSH, 6, NEQ, - }, nil, test) neqResult := machine.Pop() @@ -153,7 +152,7 @@ func TestComparison(test *testing.T) { } func TestPeekPoke(test *testing.T) { - machine := runMachineTest ([]int { + machine := runMachineTest([]int{ PUSH, 0, PEEK, @@ -163,14 +162,14 @@ func TestPeekPoke(test *testing.T) { PUSH, 1, PEEK, - }, []int { + }, []int{ 632, 13, }, test) - + secondResult := machine.Pop() firstResult := machine.Pop() - + test.Log("first:", firstResult) test.Log("second:", secondResult) @@ -186,12 +185,12 @@ func TestPeekPoke(test *testing.T) { } func TestHalt(test *testing.T) { - machine := runMachineTest ([]int { + machine := runMachineTest([]int{ PUSH, 32, HALT, PUSH, 3, }, nil, test) - + result := machine.Pop() test.Log("popped:", result) @@ -202,11 +201,11 @@ func TestHalt(test *testing.T) { } func TestJump(test *testing.T) { - machine := runMachineTest ([]int { + machine := runMachineTest([]int{ PUSH, 1, PUSH, 8, JMP, - + PUSH, 3, HALT, @@ -219,7 +218,7 @@ func TestJump(test *testing.T) { PUSH, 5, }, nil, test) - + result := machine.Pop() test.Log("popped:", result) @@ -231,8 +230,8 @@ func TestJump(test *testing.T) { func TestRegister(test *testing.T) { output := "" - machine := &Machine[int] {} - machine.LoadProgram([]int { + machine := &Machine[int]{} + machine.LoadProgram([]int{ PUSH, int('h'), PUSH, 4, CAL, diff --git a/examples/echo.go b/examples/echo.go index c5ff5a1..453f86e 100644 --- a/examples/echo.go +++ b/examples/echo.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -5,12 +6,12 @@ package main import "os" import cre "git.tebibyte.media/sashakoshka/creature" -func main () { +func main() { // this is a simple echo program. it will take in input indefinetly and // repeat it. due to line buffering in the terminal however, it will // only print output once you have pressed enter. - machine := cre.Machine[int] {} - machine.LoadProgram([]int { + machine := cre.Machine[int]{} + machine.LoadProgram([]int{ cre.PUSH, 0, cre.CAL, @@ -22,20 +23,22 @@ func main () { cre.JMP, }) - machine.Register (0, read) - machine.Register (1, write) + machine.Register(0, read) + machine.Register(1, write) err := machine.Execute(0) - if err != nil { panic(err.Error()) } + if err != nil { + panic(err.Error()) + } } -func read (machine *cre.Machine[int]) (stop bool) { - ch := []byte { 0 } +func read(machine *cre.Machine[int]) (stop bool) { + ch := []byte{0} os.Stdin.Read(ch) machine.Push(int(ch[0])) return } -func write (machine *cre.Machine[int]) (stop bool) { +func write(machine *cre.Machine[int]) (stop bool) { print(string(rune(machine.Pop()))) return } diff --git a/examples/psychiatrist.go b/examples/psychiatrist.go index f3e4ec9..3184972 100644 --- a/examples/psychiatrist.go +++ b/examples/psychiatrist.go @@ -1,3 +1,4 @@ +//go:build ignore // +build ignore package main @@ -5,7 +6,7 @@ package main import "os" import cre "git.tebibyte.media/sashakoshka/creature" -func main () { +func main() { // this is an "ai psychiatrist" program. when it starts, it asks the // user "What brings you in today?", and no matter what the user types, // the program will respond with "And how does that make you feel?". @@ -13,15 +14,15 @@ func main () { // point. // constant address values - x := 0 - introStart := 1 - introLoopStart := 5 - readLoopStart := 36 - responseStart := 71 + x := 0 + introStart := 1 + introLoopStart := 5 + readLoopStart := 36 + responseStart := 71 responseLoopStart := 50 - - machine := cre.Machine[int] {} - machine.LoadProgram([]int { + + machine := cre.Machine[int]{} + machine.LoadProgram([]int{ // reset x cre.PUSH, introStart, cre.PUSH, x, @@ -38,7 +39,7 @@ func main () { cre.EQ, cre.PUSH, readLoopStart, cre.JMP, - + // get char cre.PUSH, x, cre.PEEK, @@ -87,7 +88,7 @@ func main () { cre.EQ, cre.PUSH, readLoopStart, cre.JMP, - + // get char cre.PUSH, x, cre.PEEK, @@ -111,33 +112,35 @@ func main () { cre.JMP, }) - stringData := []byte ( + stringData := []byte( "\x00" + - "== Artificial Intelligence Psychiatrist ==\n" + - "What brings you in today?\n\x00" + - "And how does that make you feel?\n\x00") + "== Artificial Intelligence Psychiatrist ==\n" + + "What brings you in today?\n\x00" + + "And how does that make you feel?\n\x00") block := make([]int, len(stringData)) - + for index, char := range stringData { block[index] = int(char) } - + machine.LoadMemory(block) - machine.Register (0, read) - machine.Register (1, write) - + machine.Register(0, read) + machine.Register(1, write) + err := machine.Execute(0) - if err != nil { panic(err.Error()) } + if err != nil { + panic(err.Error()) + } } -func read (machine *cre.Machine[int]) (stop bool) { - ch := []byte { 0 } +func read(machine *cre.Machine[int]) (stop bool) { + ch := []byte{0} os.Stdin.Read(ch) machine.Push(int(ch[0])) return } -func write (machine *cre.Machine[int]) (stop bool) { +func write(machine *cre.Machine[int]) (stop bool) { print(string(rune(machine.Pop()))) return }