| 131 | } |
| 132 | |
| 133 | func (expr *Expression) Evaluate(ctx *ExecutionContext) (*Value, *Error) { |
| 134 | v1, err := expr.expr1.Evaluate(ctx) |
| 135 | if err != nil { |
| 136 | return nil, err |
| 137 | } |
| 138 | if expr.expr2 != nil { |
| 139 | switch expr.opToken.Val { |
| 140 | case "and", "&&": |
| 141 | if !v1.IsTrue() { |
| 142 | return AsValue(false), nil |
| 143 | } else { |
| 144 | v2, err := expr.expr2.Evaluate(ctx) |
| 145 | if err != nil { |
| 146 | return nil, err |
| 147 | } |
| 148 | return AsValue(v2.IsTrue()), nil |
| 149 | } |
| 150 | case "or", "||": |
| 151 | if v1.IsTrue() { |
| 152 | return AsValue(true), nil |
| 153 | } else { |
| 154 | v2, err := expr.expr2.Evaluate(ctx) |
| 155 | if err != nil { |
| 156 | return nil, err |
| 157 | } |
| 158 | return AsValue(v2.IsTrue()), nil |
| 159 | } |
| 160 | default: |
| 161 | return nil, ctx.Error(fmt.Sprintf("unimplemented: %s", expr.opToken.Val), expr.opToken) |
| 162 | } |
| 163 | } else { |
| 164 | return v1, nil |
| 165 | } |
| 166 | } |
| 167 | |
| 168 | func (expr *relationalExpression) Evaluate(ctx *ExecutionContext) (*Value, *Error) { |
| 169 | v1, err := expr.expr1.Evaluate(ctx) |