[java] Add Boolean converter to Value, add collections example

This commit is contained in:
aNNiMON 2023-10-14 00:09:08 +03:00 committed by Victor Melnik
parent 3bed30ca59
commit a05e9e55e3
3 changed files with 96 additions and 2 deletions

View File

@ -0,0 +1,44 @@
use java
println "OwnLang array to Java array"
arr = toObject([1, 2, 4, 2, 0, 4, 3])
println arr
println "\nArrays.asList"
Arrays = newClass("java.util.Arrays")
list1 = Arrays.asList(arr)
println list1
println "\nStack"
Stack = newClass("java.util.Stack")
stack = new Stack()
stack.push(1)
stack.push(2)
stack.push(3)
println stack.pop()
println stack.pop()
println "\nArrayList from Stack"
ArrayList = newClass("java.util.ArrayList")
list2 = new ArrayList(stack)
list2.add(4)
for element : list2.toArray() {
println element
}
println "\nHashSet"
HashSet = newClass("java.util.HashSet")
set = new HashSet(list1)
println set
containsFour = set.contains(4)
// NOTE: containsFour is java.lang.Boolean
println containsFour.getClass()
isContainsFour = toValue(containsFour)
if (isContainsFour) {
println "Set contains 4"
}
for element : set.toArray() {
println element
}

View File

@ -24,6 +24,8 @@ public final class java implements Module {
public Map<String, Value> constants() {
final var result = new LinkedHashMap<String, Value>(16);
result.put("null", NULL);
result.put("TRUE", new ObjectValue(Boolean.TRUE));
result.put("FALSE", new ObjectValue(Boolean.FALSE));
result.put("boolean.class", new ClassValue(boolean.class));
result.put("boolean[].class", new ClassValue(boolean[].class));
result.put("boolean[][].class", new ClassValue(boolean[][].class));
@ -258,8 +260,11 @@ public final class java implements Module {
private Value toValue(Value[] args) {
Arguments.check(1, args.length);
if (args[0] instanceof ObjectValue) {
return objectToValue( ((ObjectValue) args[0]).object );
if (args[0] instanceof ObjectValue obj) {
if (obj.object != null && Boolean.class.isAssignableFrom(obj.object.getClass())) {
return NumberValue.fromBoolean((Boolean) obj.object);
}
return objectToValue(obj.object);
}
return NULL;
}

View File

@ -0,0 +1,45 @@
// Simple parser example
use std, types
operations = {
"+" : def(a,b) = a+b,
"-" : def(a,b) = a-b,
"*" : def(a,b) = a*b,
"/" : def(a,b) = a/b,
"%" : def(a,b) = a%b,
">" : def(a,b) = a>b,
"<" : def(a,b) = a<b
}
def calculate(expression) {
pos = 0
len = length(expression)
def isDigit(c) = 48 <= c && c <= 57
def parseNumber() {
buffer = ""
while (pos < len && isDigit(expression.charAt(pos))) {
buffer += toChar(expression.charAt(pos))
pos++
}
return number(buffer)
}
def parseOperation() {
while (pos < len && !arrayKeyExists(toChar(expression.charAt(pos)), operations)) {
pos++
}
return operations[toChar(expression.charAt(pos++))]
}
num1 = parseNumber()
op = parseOperation()
num2 = parseNumber()
return op(num1, num2)
}
x = calculate("2+2")
+ calculate("400*16")
+ calculate("400/160")
+ calculate("3>4")