Ran gofmt
This commit is contained in:
parent
b0068336cd
commit
a52e5d3426
1
cmd/main.go
Normal file
1
cmd/main.go
Normal file
@ -0,0 +1 @@
|
||||
package main
|
32
creature.go
32
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],
|
||||
) (
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user