lambda expression moved to ? keyword, improvements to JIO

This commit is contained in:
Daniella / Tove 2022-04-25 12:29:52 +02:00
parent 9ef6c19237
commit 59f206210a
2 changed files with 83 additions and 2 deletions

View file

@ -133,6 +133,13 @@ public class ISBPL {
case "{": case "{":
return (idx, words, file, stack) -> { return (idx, words, file, stack) -> {
AtomicInteger i = new AtomicInteger(idx); AtomicInteger i = new AtomicInteger(idx);
ISBPLCallable block = readBlock(i, words, file, true);
stack.push(new ISBPLObject(getType("func"), block));
return i.get();
};
case "?":
return (idx, words, file, stack) -> {
AtomicInteger i = new AtomicInteger(idx + 1);
ISBPLCallable block = readBlock(i, words, file, false); ISBPLCallable block = readBlock(i, words, file, false);
stack.push(new ISBPLObject(getType("func"), block)); stack.push(new ISBPLObject(getType("func"), block));
return i.get(); return i.get();
@ -1107,7 +1114,27 @@ public class ISBPL {
return o.object; return o.object;
} }
private Object fromISBPL(ISBPLObject o, Class<?> expectedType) { public Object primitiveDefault(Class<?> expectedType) {
if(expectedType == long.class)
return 0L;
if(expectedType == int.class)
return 0;
if(expectedType == double.class)
return 0.0d;
if(expectedType == float.class)
return 0.0f;
if(expectedType == short.class)
return (short) 0;
if(expectedType == boolean.class)
return false;
if(expectedType == char.class)
return (char) 0;
if(expectedType == byte.class)
return (byte) 0;
return null;
}
public Object fromISBPL(ISBPLObject o, Class<?> expectedType) {
ISBPLType type = o.type; ISBPLType type = o.type;
if (type.equals(getType("null"))) { if (type.equals(getType("null"))) {
return null; return null;
@ -1126,7 +1153,8 @@ public class ISBPL {
else else
typeError("array", "matching-array"); typeError("array", "matching-array");
for (int i = 0 ; i < isbplArray.length ; i++) { for (int i = 0 ; i < isbplArray.length ; i++) {
Array.set(array, i, fromISBPL(isbplArray[i], expectedType.getComponentType())); Object obj = fromISBPL(isbplArray[i], expectedType.getComponentType());
Array.set(array, i, obj == null && expectedType.getComponentType().isPrimitive() ? primitiveDefault(expectedType.getComponentType()) : obj);
} }
return array; return array;
} }
@ -1161,6 +1189,18 @@ public class ISBPL {
if (object instanceof String) { if (object instanceof String) {
return toISBPLString(((String) object)); return toISBPLString(((String) object));
} }
if (object instanceof Integer)
return new ISBPLObject(getType("int"), object);
if (object instanceof Character)
return new ISBPLObject(getType("char"), object);
if (object instanceof Byte)
return new ISBPLObject(getType("byte"), object);
if (object instanceof Float)
return new ISBPLObject(getType("float"), object);
if (object instanceof Long)
return new ISBPLObject(getType("long"), object);
if (object instanceof Double)
return new ISBPLObject(getType("double"), object);
if (object.getClass().isArray()) { if (object.getClass().isArray()) {
ISBPLObject[] isbplArray = new ISBPLObject[Array.getLength(object)]; ISBPLObject[] isbplArray = new ISBPLObject[Array.getLength(object)];
for (int i = 0 ; i < isbplArray.length ; i++) { for (int i = 0 ; i < isbplArray.length ; i++) {

View file

@ -6,3 +6,44 @@ def TYPE_FILE "file" mktype =TYPE_FILE
native read native read
native flength native flength
native write native write
def _.file.&read &read =_.file.&read
func _.file.read {
_.file.&read fcall
}
def _.file.&flength &flength =_.file.&flength
func _.file.flength {
_.file.&flength fcall
}
def _.file.&write &write =_.file.&write
func _.file.write {
_.file.&write fcall
}
def _.file.&_file &_file =_.file.&_file
func _.file._file {
_.file.&_file fcall
}
def _.file.&isfile &isfile =_.file.&isfile
func _.file.isfile {
_.file.&isfile fcall
}
def File "java.io.File" JIO class =File
def FileInputStream "java.io.FileInputStream" JIO class =FileInputStream
"open" {
new1
} File gettype defmethod
"read" {
def this =this
def stream this FileInputStream new1 =stream
def bytes this length0 TYPE_LONG settype _int anew =bytes
def i 0 =i
while { i bytes alen lt } {
bytes i stream read0 _char aput
i inc
}
stream close0
bytes
} File gettype defmethod