Skip to content

Commit 1957c8e

Browse files
committed
Добавлены функции для работы со строками
1 parent da2beda commit 1957c8e

16 files changed

+294
-1
lines changed

program.own

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,9 @@ class = {
180180
"div": def(a, b) = a / b
181181
}
182182

183-
println class.add(2, class.mul(2, 2))
183+
println class.add(2, class.mul(2, 2))
184+
185+
println split("1/2/3/4/5/6", "/")
186+
println join(nums, ", ")
187+
println join(nums, "|", "/")
188+
println join(nums, ", ", "[", "]")
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_charat implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length != 2) throw new ArgumentsMismatchException("Two arguments expected");
11+
12+
final String input = args[0].asString();
13+
final int index = (int) args[1].asNumber();
14+
15+
return new NumberValue(input.charAt(index));
16+
}
17+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_indexof implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String what = args[1].asString();
14+
final int index = (args.length == 3) ? ((int) args[2].asNumber()) : 0;
15+
16+
return new NumberValue(input.indexOf(what, index));
17+
}
18+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.exceptions.TypeException;
5+
import com.annimon.ownlang.lib.*;
6+
7+
public final class std_join implements Function {
8+
9+
@Override
10+
public Value execute(Value... args) {
11+
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected");
12+
if (args[0].type() != Types.ARRAY) {
13+
throw new TypeException("Array expected in first argument");
14+
}
15+
16+
final ArrayValue array = (ArrayValue) args[0];
17+
switch (args.length) {
18+
case 1:
19+
return join(array, "", "", "");
20+
case 2:
21+
return join(array, args[1].asString(), "", "");
22+
case 3:
23+
return join(array, args[1].asString(), args[2].asString(), args[2].asString());
24+
case 4:
25+
return join(array, args[1].asString(), args[2].asString(), args[3].asString());
26+
default:
27+
throw new ArgumentsMismatchException("Wrong number of arguments");
28+
}
29+
}
30+
31+
private static StringValue join(ArrayValue array, String delimiter, String prefix, String suffix) {
32+
final StringBuilder sb = new StringBuilder();
33+
for (Value value : array) {
34+
if (sb.length() > 0) sb.append(delimiter);
35+
else sb.append(prefix);
36+
sb.append(value.asString());
37+
}
38+
sb.append(suffix);
39+
return new StringValue(sb.toString());
40+
}
41+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_lastindexof implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String what = args[1].asString();
14+
final int index = (args.length == 3) ? ((int) args[2].asNumber()) : 0;
15+
16+
return new NumberValue(input.lastIndexOf(what, index));
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_replace implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String target = args[1].asString();
14+
final String replacement = args[2].asString();
15+
16+
return new StringValue(input.replace(target, replacement));
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_replaceall implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String regex = args[1].asString();
14+
final String replacement = args[2].asString();
15+
16+
return new StringValue(input.replaceAll(regex, replacement));
17+
}
18+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_replacefirst implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length != 3) throw new ArgumentsMismatchException("Three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String regex = args[1].asString();
14+
final String replacement = args[2].asString();
15+
16+
return new StringValue(input.replaceFirst(regex, replacement));
17+
}
18+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_split implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length < 2 || args.length > 3) throw new ArgumentsMismatchException("Two or three arguments expected");
11+
12+
final String input = args[0].asString();
13+
final String regex = args[1].asString();
14+
final int limit = (args.length == 3) ? ((int) args[2].asNumber()) : 0;
15+
16+
final String[] parts = input.split(regex, limit);
17+
final ArrayValue result = new ArrayValue(parts.length);
18+
for (int i = 0; i < parts.length; i++) {
19+
result.set(i, new StringValue(parts[i]));
20+
}
21+
22+
return result;
23+
}
24+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.annimon.ownlang.lib.modules.functions;
2+
3+
import com.annimon.ownlang.exceptions.ArgumentsMismatchException;
4+
import com.annimon.ownlang.lib.*;
5+
6+
public final class std_sprintf implements Function {
7+
8+
@Override
9+
public Value execute(Value... args) {
10+
if (args.length < 1) throw new ArgumentsMismatchException("At least one argument expected");
11+
12+
final String format = args[0].asString();
13+
final Object[] values = new Object[args.length - 1];
14+
for (int i = 1; i < args.length; i++) {
15+
values[i - 1] = (args[i].type() == Types.NUMBER) ? args[i].asNumber() : args[i].asString();
16+
}
17+
return new StringValue(String.format(format, values));
18+
}
19+
}

0 commit comments

Comments
 (0)