From ee9397bc031dc33e4f735b3331643bbf60a0d17a Mon Sep 17 00:00:00 2001 From: Marc Vertes Date: Fri, 16 Jan 2026 12:30:31 +0100 Subject: feat: handle slice expressions --- interp/interpreter.go | 3 ++- interp/interpreter_test.go | 17 +++++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) (limited to 'interp') diff --git a/interp/interpreter.go b/interp/interpreter.go index 8d372c3..4faba28 100644 --- a/interp/interpreter.go +++ b/interp/interpreter.go @@ -42,7 +42,8 @@ func (i *Interp) Eval(src string) (res reflect.Value, err error) { i.Push(i.Data[dataOffset:]...) i.PushCode(i.Code[codeOffset:]...) if s, ok := i.Symbols["main"]; ok { - i.PushCode(vm.Instruction{Op: vm.Calli, Arg: []int{int(i.Data[s.Index].Int())}}) + i.PushCode(vm.Instruction{Op: vm.Push, Arg: []int{int(i.Data[s.Index].Int())}}) + i.PushCode(vm.Instruction{Op: vm.Call, Arg: []int{0}}) } i.PushCode(vm.Instruction{Op: vm.Exit}) i.SetIP(max(codeOffset, i.Entry)) diff --git a/interp/interpreter_test.go b/interp/interpreter_test.go index bf90357..7a974d1 100644 --- a/interp/interpreter_test.go +++ b/interp/interpreter_test.go @@ -230,6 +230,23 @@ func TestMap(t *testing.T) { }) } +func TestSlice(t *testing.T) { + src0 := `s := []int{0, 1, 2, 3};` + run(t, []etest{ + {src: src0 + `s`, res: `[0 1 2 3]`}, // #00 + {src: src0 + `s[:]`, res: `[0 1 2 3]`}, // #01 + {src: src0 + `s[1:3]`, res: `[1 2]`}, // #02 + {src: src0 + `s[1:3:4]`, res: `[1 2]`}, // #03 + {src: src0 + `s[:3:4]`, res: `[0 1 2]`}, // #04 + {src: src0 + `s[:2:]`, err: `final index required in 3-index slice`}, // #05 + {src: src0 + `s[:3:4:]`, err: `expected ']', found ':'`}, // #06 + {src: src0 + `s[2:]`, res: `[2 3]`}, // #07 + {src: src0 + `s[:0]`, res: `[]`}, // #08 + {src: `"Hello"[1:3]`, res: `el`}, // #09 + {src: `s := "Hello"; s[1:3]`, res: `el`}, // #10 + }) +} + func TestType(t *testing.T) { src0 := `type ( I int -- cgit v1.2.3