Skip to content

Commit 5d00598

Browse files
committed
[std] Add parseDouble, nanotime, exit, getenv, getprop
1 parent c3a893e commit 5d00598

38 files changed

+146
-142
lines changed

modules/main/src/main/java/com/annimon/ownlang/modules/std/ArrayFunctions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
import com.annimon.ownlang.lib.ValueUtils;
1111
import java.io.UnsupportedEncodingException;
1212

13-
public final class ArrayFunctions {
13+
final class ArrayFunctions {
1414

1515
private ArrayFunctions() { }
1616

modules/main/src/main/java/com/annimon/ownlang/modules/std/NumberFunctions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
import com.annimon.ownlang.lib.Types;
77
import com.annimon.ownlang.lib.Value;
88

9-
public final class NumberFunctions {
9+
final class NumberFunctions {
1010

1111
private NumberFunctions() { }
1212

modules/main/src/main/java/com/annimon/ownlang/modules/std/StringFunctions.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.annimon.ownlang.lib.Value;
99
import java.io.UnsupportedEncodingException;
1010

11-
public final class StringFunctions {
11+
final class StringFunctions {
1212

1313
private StringFunctions() { }
1414

@@ -21,6 +21,11 @@ static ArrayValue getBytes(Value[] args) {
2121
throw new OwnLangRuntimeException(uee);
2222
}
2323
}
24+
25+
static Value parseDouble(Value[] args) {
26+
Arguments.check(1, args.length);
27+
return NumberValue.of(Double.parseDouble(args[0].asString()));
28+
}
2429

2530
static Value parseInt(Value[] args) {
2631
Arguments.checkOrOr(1, 2, args.length);
@@ -45,7 +50,7 @@ static Value stripMargin(Value[] args) {
4550

4651
// First blank line is omitted
4752
final StringBuilder sb = new StringBuilder();
48-
final int firstLineIndex = (isBlank(lines[0])) ? 1 : 0;
53+
final int firstLineIndex = (lines[0].isBlank()) ? 1 : 0;
4954
final int lastLineIndex = lines.length - 1;
5055
int index = firstLineIndex;
5156
while (true) {
@@ -54,7 +59,7 @@ static Value stripMargin(Value[] args) {
5459
sb.append('\n');
5560
}
5661
// Process last line
57-
if (lastLineIndex >= (firstLineIndex + 1) && !isBlank(lines[lastLineIndex])) {
62+
if (lastLineIndex >= (firstLineIndex + 1) && !lines[lastLineIndex].isBlank()) {
5863
sb.append('\n').append(strip(lines[lastLineIndex], marginPrefix));
5964
}
6065
return new StringValue(sb.toString());
@@ -68,10 +73,6 @@ private static String strip(String str, String marginPrefix) {
6873
return str;
6974
}
7075
}
71-
72-
private static boolean isBlank(String str) {
73-
return firstNonBlankIndex(str) == str.length();
74-
}
7576

7677
private static int firstNonBlankIndex(String str) {
7778
final int length = str.length();
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.annimon.ownlang.modules.std;
2+
3+
import com.annimon.ownlang.lib.*;
4+
5+
final class SystemFunctions {
6+
7+
private SystemFunctions() { }
8+
9+
static Value exit(Value[] args) {
10+
Arguments.check(1, args.length);
11+
System.exit(args[0].asInt());
12+
return NumberValue.ZERO;
13+
}
14+
15+
static Value getenv(Value[] args) {
16+
Arguments.checkOrOr(1, 2, args.length);
17+
final var env = System.getenv(args[0].asString());
18+
if (env == null) {
19+
return args.length == 2 ? args[1] : StringValue.EMPTY;
20+
}
21+
return new StringValue(env);
22+
}
23+
24+
static Value getprop(Value[] args) {
25+
Arguments.checkOrOr(1, 2, args.length);
26+
final var env = System.getProperty(args[0].asString());
27+
if (env == null) {
28+
return args.length == 2 ? args[1] : StringValue.EMPTY;
29+
}
30+
return new StringValue(env);
31+
}
32+
33+
static Value time(Value[] args) {
34+
Arguments.check(0, args.length);
35+
return NumberValue.of(System.currentTimeMillis());
36+
}
37+
38+
static Value nanotime(Value[] args) {
39+
Arguments.check(0, args.length);
40+
return NumberValue.of(System.nanoTime());
41+
}
42+
}

modules/main/src/main/java/com/annimon/ownlang/modules/std/std.java

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.annimon.ownlang.Version;
55
import com.annimon.ownlang.lib.*;
66
import com.annimon.ownlang.modules.Module;
7+
import java.util.HashMap;
78
import java.util.Map;
89
import static java.util.Map.entry;
910

@@ -30,22 +31,31 @@ public Map<String, Value> constants() {
3031

3132
@Override
3233
public Map<String, Function> functions() {
33-
return Map.ofEntries(
34+
// std, System
35+
final var result = new HashMap<>(Map.ofEntries(
3436
entry("echo", new std_echo()),
3537
entry("readln", new std_readln()),
3638
entry("length", new std_length()),
3739
entry("rand", new std_rand()),
38-
entry("time", new std_time()),
40+
entry("time", SystemFunctions::time),
41+
entry("nanotime", SystemFunctions::nanotime),
3942
entry("sleep", new std_sleep()),
4043
entry("thread", new std_thread()),
4144
entry("sync", new std_sync()),
4245
entry("try", new std_try()),
4346
entry("default", new std_default()),
47+
entry("exit", SystemFunctions::exit),
48+
entry("getenv", SystemFunctions::getenv),
49+
entry("getprop", SystemFunctions::getprop)
50+
));
4451

45-
// Numbers
46-
entry("toHexString", NumberFunctions::toHexString),
52+
// Numbers
53+
result.putAll(Map.ofEntries(
54+
entry("toHexString", NumberFunctions::toHexString)
55+
));
4756

48-
// String
57+
// String
58+
result.putAll(Map.ofEntries(
4959
entry("getBytes", StringFunctions::getBytes),
5060
entry("sprintf", new std_sprintf()),
5161
entry("split", new std_split()),
@@ -62,9 +72,12 @@ public Map<String, Function> functions() {
6272
entry("replaceFirst", new std_replacefirst()),
6373
entry("parseInt", StringFunctions::parseInt),
6474
entry("parseLong", StringFunctions::parseLong),
65-
entry("stripMargin", StringFunctions::stripMargin),
75+
entry("parseDouble", StringFunctions::parseDouble),
76+
entry("stripMargin", StringFunctions::stripMargin)
77+
));
6678

67-
// Arrays and map,
79+
// Arrays and map
80+
result.putAll(Map.ofEntries(
6881
entry("newarray", new std_newarray()),
6982
entry("join", new std_join()),
7083
entry("sort", new std_sort()),
@@ -75,6 +88,7 @@ public Map<String, Function> functions() {
7588
entry("arraySplice", new std_arraySplice()),
7689
entry("range", new std_range()),
7790
entry("stringFromBytes", ArrayFunctions::stringFromBytes)
78-
);
91+
));
92+
return Map.copyOf(result);
7993
}
8094
}

modules/main/src/main/java/com/annimon/ownlang/modules/std/std_arrayCombine.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.annimon.ownlang.lib.Types;
99
import com.annimon.ownlang.lib.Value;
1010

11-
public final class std_arrayCombine implements Function {
11+
final class std_arrayCombine implements Function {
1212

1313
@Override
1414
public Value execute(Value[] args) {

modules/main/src/main/java/com/annimon/ownlang/modules/std/std_arrayKeyExists.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
import com.annimon.ownlang.lib.Types;
99
import com.annimon.ownlang.lib.Value;
1010

11-
public final class std_arrayKeyExists implements Function {
11+
final class std_arrayKeyExists implements Function {
1212

1313
@Override
1414
public Value execute(Value[] args) {

modules/main/src/main/java/com/annimon/ownlang/modules/std/std_arrayKeys.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313

14-
public final class std_arrayKeys implements Function {
14+
final class std_arrayKeys implements Function {
1515

1616
@Override
1717
public Value execute(Value[] args) {

modules/main/src/main/java/com/annimon/ownlang/modules/std/std_arraySplice.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
import com.annimon.ownlang.lib.Types;
88
import com.annimon.ownlang.lib.Value;
99

10-
public final class std_arraySplice implements Function {
10+
final class std_arraySplice implements Function {
1111

1212
@Override
1313
public Value execute(Value[] args) {

modules/main/src/main/java/com/annimon/ownlang/modules/std/std_arrayValues.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
import java.util.List;
1212
import java.util.Map;
1313

14-
public final class std_arrayValues implements Function {
14+
final class std_arrayValues implements Function {
1515

1616
@Override
1717
public Value execute(Value[] args) {

0 commit comments

Comments
 (0)