diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..053c906 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +*.own linguist-language=Scala diff --git a/README.md b/README.md index dfa95af..2b6669c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ OwnLang - dynamic functional programming language inspired by Scala and Python. | Free | Pro | Desktop | | :--: | :-: | :-----: | -| [![Free](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [![Pro](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v1.5.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/1.5.0) +| [![Free](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang.free) | [![Pro](https://developer.android.com/images/brand/en_generic_rgb_wo_45.png)](https://play.google.com/store/apps/details?id=com.annimon.ownlang) | [v1.5.0](https://github.com/aNNiMON/Own-Programming-Language-Tutorial/releases/tag/v1.5.0) Also available as AUR package: diff --git a/src/main/java/com/annimon/ownlang/lib/ClassInstanceValue.java b/src/main/java/com/annimon/ownlang/lib/ClassInstanceValue.java index a0e2a4a..9a2ff76 100644 --- a/src/main/java/com/annimon/ownlang/lib/ClassInstanceValue.java +++ b/src/main/java/com/annimon/ownlang/lib/ClassInstanceValue.java @@ -8,6 +8,7 @@ public class ClassInstanceValue implements Value { private final String className; private final MapValue thisMap; private ClassMethod constructor; + private UserDefinedFunction toString; public ClassInstanceValue(String name) { this.className = name; @@ -17,28 +18,32 @@ public class ClassInstanceValue implements Value { public MapValue getThisMap() { return thisMap; } - + public String getClassName() { return className; } - + public void addField(String name, Value value) { thisMap.set(name, value); } - + public void addMethod(String name, ClassMethod method) { + if (name.equals("toString")) { + toString = method; + } thisMap.set(name, method); if (name.equals(className)) { constructor = method; } } - + + public void callConstructor(Value[] args) { if (constructor != null) { constructor.execute(args); } } - + public Value access(Value value) { return thisMap.get(value); } @@ -46,7 +51,7 @@ public class ClassInstanceValue implements Value { public void set(Value key, Value value) { final Value v = thisMap.get(key); if (v == null) { - throw new RuntimeException("Unable to add new field " + throw new RuntimeException("Unable to add new field " + key.asString() + " to class " + className); } thisMap.set(key, value); @@ -69,14 +74,17 @@ public class ClassInstanceValue implements Value { @Override public String asString() { - return "class " + className + "@" + thisMap; + if (toString != null) { + return toString.execute(new Value[] {}).asString(); + } + return className + "@" + thisMap; } @Override public int type() { return Types.CLASS; } - + @Override public int hashCode() { int hash = 5; @@ -99,7 +107,7 @@ public class ClassInstanceValue implements Value { public int compareTo(Value o) { return asString().compareTo(o.asString()); } - + @Override public String toString() { return asString(); diff --git a/src/main/java/com/annimon/ownlang/modules/date/date.java b/src/main/java/com/annimon/ownlang/modules/date/date.java index b83e24c..7f5e10d 100644 --- a/src/main/java/com/annimon/ownlang/modules/date/date.java +++ b/src/main/java/com/annimon/ownlang/modules/date/date.java @@ -58,7 +58,7 @@ public final class date implements Module { value.set(YEAR, NumberValue.of(calendar.get(Calendar.YEAR))); value.set(MONTH, NumberValue.of(calendar.get(Calendar.MONTH))); value.set(DAY, NumberValue.of(calendar.get(Calendar.DAY_OF_MONTH))); - value.set(HOUR, NumberValue.of(calendar.get(Calendar.HOUR))); + value.set(HOUR, NumberValue.of(calendar.get(Calendar.HOUR_OF_DAY))); value.set(MINUTE, NumberValue.of(calendar.get(Calendar.MINUTE))); value.set(SECOND, NumberValue.of(calendar.get(Calendar.SECOND))); value.set(MILLISECOND, NumberValue.of(calendar.get(Calendar.MILLISECOND)));