func (u *unaryCall) Eval(context value.Context) value.Value { arg := u.arg.Eval(context) context.Push() defer context.Pop() exec := context.(*execContext) // Sigh. fn := exec.unaryFn[u.name] if fn == nil || fn.body == nil { value.Errorf("unary %q undefined", u.name) } context.AssignLocal(fn.right.name, arg) var v value.Value for _, e := range fn.body { v = e.Eval(context) } if v == nil { value.Errorf("no value returned by %q", u.name) } return v }
func (b *binaryCall) Eval(context value.Context) value.Value { left := b.left.Eval(context) right := b.right.Eval(context) context.Push() defer context.Pop() exec := context.(*execContext) // Sigh. fn := exec.binaryFn[b.name] if fn == nil || fn.body == nil { value.Errorf("binary %q undefined", b.name) } context.AssignLocal(fn.left.name, left) context.AssignLocal(fn.right.name, right) var v value.Value for _, e := range fn.body { v = e.Eval(context) } if v == nil { value.Errorf("no value returned by %q", b.name) } return v }