mirror of
https://github.com/aNNiMON/Own-Programming-Language-Tutorial.git
synced 2024-09-20 08:44:20 +03:00
Быстрый доступ к объекту Value
This commit is contained in:
parent
e947ae01d5
commit
2783417d4b
@ -72,6 +72,11 @@ public final class ArrayValue implements Value, Iterable<Value> {
|
||||
elements[index] = value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object raw() {
|
||||
return elements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInt() {
|
||||
throw new TypeException("Cannot cast array to integer");
|
||||
|
@ -22,6 +22,11 @@ public final class FunctionValue implements Value {
|
||||
return Types.FUNCTION;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object raw() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInt() {
|
||||
throw new TypeException("Cannot cast function to integer");
|
||||
|
@ -45,6 +45,11 @@ public class MapValue implements Value, Iterable<Map.Entry<Value, Value>> {
|
||||
map.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object raw() {
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInt() {
|
||||
throw new TypeException("Cannot cast map to integer");
|
||||
|
@ -25,6 +25,7 @@ public final class NumberValue implements Value {
|
||||
return Types.NUMBER;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Number raw() {
|
||||
return value;
|
||||
}
|
||||
|
@ -24,6 +24,11 @@ public final class StringValue implements Value {
|
||||
public int type() {
|
||||
return Types.STRING;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object raw() {
|
||||
return value;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int asInt() {
|
||||
|
@ -6,6 +6,8 @@ package com.annimon.ownlang.lib;
|
||||
*/
|
||||
public interface Value extends Comparable<Value> {
|
||||
|
||||
Object raw();
|
||||
|
||||
int asInt();
|
||||
|
||||
double asNumber();
|
||||
|
@ -26,7 +26,7 @@ public final class json_encode implements Function {
|
||||
case Types.MAP:
|
||||
return process((MapValue) val);
|
||||
case Types.NUMBER:
|
||||
return ((NumberValue) val).raw();
|
||||
return val.raw();
|
||||
case Types.STRING:
|
||||
return val.asString();
|
||||
default:
|
||||
|
@ -13,7 +13,7 @@ public final class std_sprintf implements Function {
|
||||
final Object[] values = new Object[args.length - 1];
|
||||
for (int i = 1; i < args.length; i++) {
|
||||
values[i - 1] = (args[i].type() == Types.NUMBER)
|
||||
? ((NumberValue) args[i]).raw()
|
||||
? args[i].raw()
|
||||
: args[i].asString();
|
||||
}
|
||||
return new StringValue(String.format(format, values));
|
||||
|
@ -101,7 +101,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 + number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Double || number2 instanceof Double) {
|
||||
return new NumberValue(number1.doubleValue() + number2.doubleValue());
|
||||
}
|
||||
@ -138,7 +138,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 - number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Double || number2 instanceof Double) {
|
||||
return new NumberValue(number1.doubleValue() - number2.doubleValue());
|
||||
}
|
||||
@ -184,7 +184,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 * number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Double || number2 instanceof Double) {
|
||||
return new NumberValue(number1.doubleValue() * number2.doubleValue());
|
||||
}
|
||||
@ -221,7 +221,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 / number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Double || number2 instanceof Double) {
|
||||
return new NumberValue(number1.doubleValue() / number2.doubleValue());
|
||||
}
|
||||
@ -258,7 +258,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 % number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Double || number2 instanceof Double) {
|
||||
return new NumberValue(number1.doubleValue() % number2.doubleValue());
|
||||
}
|
||||
@ -303,7 +303,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 & number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() & number2.longValue());
|
||||
}
|
||||
@ -328,7 +328,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 | number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() | number2.longValue());
|
||||
}
|
||||
@ -353,7 +353,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 ^ number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() ^ number2.longValue());
|
||||
}
|
||||
@ -383,7 +383,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 << number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() << number2.longValue());
|
||||
}
|
||||
@ -408,7 +408,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 >> number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() >> number2.longValue());
|
||||
}
|
||||
@ -433,7 +433,7 @@ public final class BinaryExpression implements Expression {
|
||||
final Number number1 = value1.raw();
|
||||
if (value2.type() == Types.NUMBER) {
|
||||
// number1 >>> number2
|
||||
final Number number2 = ((NumberValue) value2).raw();
|
||||
final Number number2 = (Number) value2.raw();
|
||||
if (number1 instanceof Long || number2 instanceof Long) {
|
||||
return new NumberValue(number1.longValue() >>> number2.longValue());
|
||||
}
|
||||
|
@ -88,7 +88,7 @@ public final class UnaryExpression implements Expression, Statement {
|
||||
|
||||
private Value increment(Value value) {
|
||||
if (value.type() == Types.NUMBER) {
|
||||
final Number number = ((NumberValue) value).raw();
|
||||
final Number number = (Number) value.raw();
|
||||
if (number instanceof Double) {
|
||||
return new NumberValue(number.doubleValue() + 1);
|
||||
}
|
||||
@ -104,7 +104,7 @@ public final class UnaryExpression implements Expression, Statement {
|
||||
|
||||
private Value decrement(Value value) {
|
||||
if (value.type() == Types.NUMBER) {
|
||||
final Number number = ((NumberValue) value).raw();
|
||||
final Number number = (Number) value.raw();
|
||||
if (number instanceof Double) {
|
||||
return new NumberValue(number.doubleValue() - 1);
|
||||
}
|
||||
@ -124,7 +124,7 @@ public final class UnaryExpression implements Expression, Statement {
|
||||
return new StringValue(sb.reverse().toString());
|
||||
}
|
||||
if (value.type() == Types.NUMBER) {
|
||||
final Number number = ((NumberValue) value).raw();
|
||||
final Number number = (Number) value.raw();
|
||||
if (number instanceof Double) {
|
||||
return new NumberValue(-number.doubleValue());
|
||||
}
|
||||
@ -140,7 +140,7 @@ public final class UnaryExpression implements Expression, Statement {
|
||||
|
||||
private Value complement(Value value) {
|
||||
if (value.type() == Types.NUMBER) {
|
||||
final Number number = ((NumberValue) value).raw();
|
||||
final Number number = (Number) value.raw();
|
||||
if (number instanceof Long) {
|
||||
return new NumberValue(~number.longValue());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user