Skip to content

Commit

Permalink
Merge pull request #151 from rokostik/add-eval-block
Browse files Browse the repository at this point in the history
Implement evaluated block
  • Loading branch information
refaktor authored Mar 5, 2024
2 parents 92ef553 + bbe4952 commit 22d14b9
Show file tree
Hide file tree
Showing 3 changed files with 83 additions and 1 deletion.
20 changes: 19 additions & 1 deletion evaldo/evaldo.go
Original file line number Diff line number Diff line change
Expand Up @@ -292,10 +292,28 @@ func EvalExpressionConcrete(ps *env.ProgramState) *env.ProgramState {
//trace2("Before entering expression")
if object != nil {
switch object.Type() {
case env.IntegerType, env.DecimalType, env.StringType, env.BlockType, env.VoidType, env.UriType, env.EmailType: // env.TagwordType, JM 20230126
case env.IntegerType, env.DecimalType, env.StringType, env.VoidType, env.UriType, env.EmailType: // env.TagwordType, JM 20230126
if !ps.SkipFlag {
ps.Res = object
}
case env.BlockType:
if !ps.SkipFlag {
block := object.(env.Block)
// block mode 1 is for eval blocks
if block.Mode == 1 {
ser := ps.Ser
ps.Ser = block.Series
res := make([]env.Object, 0)
for ps.Ser.Pos() < ps.Ser.Len() {
EvalExpression2(ps, false)
res = append(res, ps.Res)
}
ps.Ser = ser
ps.Res = *env.NewBlock(*env.NewTSeries(res))
} else {
ps.Res = object
}
}
case env.TagwordType:
ps.Res = *env.NewWord(object.(env.Tagword).Index)
return ps
Expand Down
43 changes: 43 additions & 0 deletions evaldo/evaldo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package evaldo

import (
"fmt"
"strconv"

"github.com/refaktor/rye/env"
"github.com/refaktor/rye/loader"
Expand Down Expand Up @@ -408,3 +409,45 @@ func TestEvaldo_load_lsetword4(t *testing.T) {
t.Error("Expected result value 80")
}
}

func TestEvaldo_load_block(t *testing.T) {
input := "a: 1 { a 2 }"
block, genv := loader.LoadString(input, false)
es := env.NewProgramState(block.(env.Block).Series, genv)
RegisterBuiltins(es)

EvalBlock(es)

nonEvaluatedBlock := es.Res
if nonEvaluatedBlock.Type() != env.BlockType {
t.Error("Expected result type block")
}

if nonEvaluatedBlock.(env.Block).Series.Get(0).Type() != env.WordType {
t.Error("Expected first item to be evaluated to type integer but got type " + strconv.Itoa(int(nonEvaluatedBlock.(env.Block).Series.Get(0).Type())))
}
if nonEvaluatedBlock.(env.Block).Series.Get(1).Type() != env.IntegerType {
t.Error("Expected second item to be type integer")
}
}

func TestEvaldo_load_eval_block(t *testing.T) {
input := "a: 1 [ a 2 ]"
block, genv := loader.LoadString(input, false)
es := env.NewProgramState(block.(env.Block).Series, genv)
RegisterBuiltins(es)

EvalBlock(es)

evaluatedBlock := es.Res
if evaluatedBlock.Type() != env.BlockType {
t.Error("Expected result type block")
}

if evaluatedBlock.(env.Block).Series.Get(0).Type() != env.IntegerType {
t.Error("Expected first item to be evaluated to type integer but got type " + strconv.Itoa(int(evaluatedBlock.(env.Block).Series.Get(0).Type())))
}
if evaluatedBlock.(env.Block).Series.Get(1).Type() != env.IntegerType {
t.Error("Expected second item to be type integer")
}
}
21 changes: 21 additions & 0 deletions loader/loader_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package loader

import (
"fmt"
"strconv"

"github.com/refaktor/rye/env"

Expand Down Expand Up @@ -253,6 +254,26 @@ func TestLoader_multiple_newlines2(t *testing.T) {
}
}

func TestLoader_bblock(t *testing.T) {
input := "a: 1 [ a 2 ]"
block, _ := LoadString(input, false)
// expect setword, integer, block
if block.(env.Block).Series.Len() != 3 {
t.Error("Expected 3 items")
}
innerBlock := block.(env.Block).Series.Get(2)
if innerBlock.Type() != env.BlockType {
t.Error("Expected type block")
}
// block is not evaluated yet, only loaded
if innerBlock.(env.Block).Series.Get(0).Type() != env.WordType {
t.Error("Expected first item to be evaluated to type integer but got type " + strconv.Itoa(int(innerBlock.(env.Block).Series.Get(0).Type())))
}
if innerBlock.(env.Block).Series.Get(1).Type() != env.IntegerType {
t.Error("Expected second item to be type integer")
}
}

func TestLoader_multiple_blocks(t *testing.T) {
input := "\n\t123 { { 22 } aa } \nword2\tsetword2:\n\t234"
block, _ := LoadString(input, false)
Expand Down

0 comments on commit 22d14b9

Please sign in to comment.