Skip to content

Commit 6c093e5

Browse files
committed
Переопределение операторов
1 parent 1cc4dc8 commit 6c093e5

File tree

2 files changed

+18
-2
lines changed

2 files changed

+18
-2
lines changed

program.own

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,4 +234,8 @@ xarr[0]++
234234
println xarr[0]
235235

236236
`extended word variable` = 9
237-
println `extended word variable`
237+
println `extended word variable`
238+
239+
// Operator overloading
240+
def `::`(v1, v2) = string(v1) + string(v2)
241+
println 1 :: 2 :: 3

src/com/annimon/ownlang/parser/ast/BinaryExpression.java

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.annimon.ownlang.exceptions.OperationIsNotSupportedException;
44
import com.annimon.ownlang.exceptions.TypeException;
55
import com.annimon.ownlang.lib.ArrayValue;
6+
import com.annimon.ownlang.lib.Functions;
67
import com.annimon.ownlang.lib.NumberValue;
78
import com.annimon.ownlang.lib.StringValue;
89
import com.annimon.ownlang.lib.Types;
@@ -54,6 +55,17 @@ public BinaryExpression(Operator operation, Expression expr1, Expression expr2)
5455
public Value eval() {
5556
final Value value1 = expr1.eval();
5657
final Value value2 = expr2.eval();
58+
try {
59+
return eval(value1, value2);
60+
} catch (OperationIsNotSupportedException ex) {
61+
if (Functions.isExists(operation.toString())) {
62+
return Functions.get(operation.toString()).execute(value1, value2);
63+
}
64+
throw ex;
65+
}
66+
}
67+
68+
private Value eval(Value value1, Value value2) throws OperationIsNotSupportedException {
5769
switch (operation) {
5870
case ADD: return add(value1, value2);
5971
case SUBTRACT: return subtract(value1, value2);
@@ -75,10 +87,10 @@ public Value eval() {
7587
private Value add(Value value1, Value value2) {
7688
switch (value1.type()) {
7789
case Types.NUMBER: return add((NumberValue) value1, value2);
90+
case Types.STRING: return new StringValue(value1.asString() + value2.asString());
7891
case Types.ARRAY: return ArrayValue.add((ArrayValue) value1, value2);
7992
case Types.MAP: /* TODO: merge maps */
8093
case Types.FUNCTION: /* TODO: combining functions */
81-
case Types.STRING:
8294
default:
8395
// Concatenation strings
8496
return new StringValue(value1.asString() + value2.asString());

0 commit comments

Comments
 (0)