Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

[Plugin] DerpScript - język skryptowy w 100 linijkach. (Java 8, no libs)


Rekomendowane odpowiedzi

Opublikowano

Zrobiony z nudów, by odpocząć od pracy nad AutoIn.

 

Jest to bardzo prosty język skryptowy, kod interpretera ma "aż" 100 linijek. (i tak ma zostać) 

Wydajność oczywiście raczej dość kiepska, ale za to oszczędność pamięci świetna!

 

Język został stworzony też jako taki wyzwanie, jak dużo uda mi się upchnąć w 100 linijkach kodu, nie łamiąc jednocześnie najważniejszych zasad, czyli w 1 linijce, jest jedno polecenie, czasem bardzo długie, ale zawsze jedno. No i nie używa żadnych bibliotek czy wbudowanych języków skryptowych typu JavaScript czysta Java :P

 

Da się w nim też tworzyć skrypty i je wykonywać, czyli stworzyć teksty, a potem wrzucić go znowu go do interpretera, i tak w nieskończoność, taka incepcja :D

 

Pozwala też zrozumieć jak działają niektóre języki :P

 

Zaimplementowanie możliwości:

  • Tokeny i stos 
    Cały plugin działa na zasadzie prostych tokenów (1 słowo) i stosu, co oznacza że każda wprowadzona wartość, która nie jest słowiem zarezerwowanym trafia na szczyt stosu, i to właśnie ta wartość zostanie używa do przeprowadzenia operacji.
    Z powodu ograniczonego kodu, plugin używa odwrotnej notacji polskiej, której przetwarzanie nie wymaga żadnej pamięci, więc zamiast pisać: "5 + 5" to trzeba napisać "5 5 +", przez co pisanie tutaj też jest dość trudne :D
    PS: Dużo języków zmienia wszystkie twoje działania do takiej notacji, by potem szybciej je przetwarzać.
  • +, -, *, /
    Wszystkie podstawowe operacją działają, plugin operuje na double, long i boolean.
  • Slowa i liczby
    Każde wpisane słowo które nie jest zarezerwowane trafia do stosu, to samo z liczbami.
    Słowa możemy też dodawać znakiem +
    Jeśli chcemy stworzyć string zawierający nazwę instrukcji, należy rozpocząć go od \\, np \\+ \\print
  • Booleans
    Prawie o nich zapomniałem, ale udało jednak się je dodać, wystraczy wpisać TRUE lub FALSE by dodać je do stosu.
    Można na nich wykonywać operacje, tak jak w javie masz && i || i ^, tak tutaj z powodu braku symboli, używasz +, -, *, /. Jak można się łatwo domyślić, + działa tak samo jak OR (||), a * tak samo jak AND (&&), za to -, to po prostu A-B, więc A musi być true, a B false, by to zwróciło 1, znak / jest wyjątkowy, i nie działa zgodnie z domysłem, tylko robi za ^ XOR.
  • print
    Wywala do konsoli wartość ze stosu, jedna z 2 metod która nie usuwa wartości ze stosu po użyciu.
  • DUB
    Kopiuje wartość ze stosu, druga z 2 metod która nie usuwa wartości ze stosu po użyciu.
  • DEL
    Usuwa wartość ze stosu.
  • <name> SAVE
    Zapisuje podaną wartość pod podaną nazwą do pamięci, nazwa musi być pierwsza, "nazwa SAVE"
  • <name> LOAD
    Wczytuje podaną wartość do stosu. (nie usuwa z pamięci)
    W pamięci domyślnie są 2 już zapisane wartości "space" i "empty", czyli String ze spacją, i pusty string, to jedyna możliwość ich stworzenia.
  • <size> <class> NEW_ARRAY
    Tworzy nową tablicę danego typu i danego rozmiaru, oraz zapełnia ją danymi ze stosu, np:
    "one two three four five 4 java.lang.String.class NEW_ARRAY"
    da nam: 
    String[] {five, four, three, two}
    Niestety metody do pobierania/ustawiania wartości z tablic się nie zmieściły, ale zawsze możecie się pomęczyć z INVOKE i java.lang.reflect.Array
  • <object> <paramTypes... (separated by space)> <className#methodName> <num of params> INVOKE
    Pozwala wywołać dowolną metodę z javy,jeśli metoda jest statyczna to zamiast object dajemy spację, tak by były dwie, to oznacza że jest wartość NULL
    "2 3  double.class double.class java.lang.Math#pow 2 invoke" (po 3 są dwie spacje)
    Wywoła Math.pow(3, 2);
    Jeśli metoda jest typem void, to jej wartość zwrotna nie zostanie dodana do stosu.
  • Komentarze
    Po prostu rozpocznij linijkę znakami //# a zostanie ona zignorowana.

     

Oczywiście brakuje masy rzeczy, jak np możliwości tworzenia listenerów, czy jakiś warunków logicznych (if/else), instrukcji GOTO by dało się tworzyć pętle, ale co tam :D

 

 

Instalacja/Download:

Wrzuć do pluginów, zrób folder "DerpScript" i wrzucaj skrypty, każdy skrypt musi mieć rozszerzenie .drp
Download ze spigota:

http://www.spigotmc.org/resources/derpscript.3104/

 

 

 

Przykładowe kody:

 

 

//#===========================================================================================

//# It work! I don't know how! but it works!
//# DerpScript by GotoFinal :P
//# Sample codes, PS: //# This is comment
//#===========================================================================================

//# simple num tests
add print DEL
5 10 + print DEL
muliple print DEL
2 5 * print DEL
div print DEL
5 40 / print DEL
min print DEL
40 2 - print DEL
//# Method invoking test, replace ing to _ping in testing, and Math.pow(4, Math.pow(3, 2))
testing
print
_ping ing testujemy java.lang.CharSequence java.lang.CharSequence java.lang.String#replace 2 invoke print
pow print DEL DEL DEL DEL DEL DEL
2 3  double.class double.class java.lang.Math#pow 2 invoke print
4  double.class double.class java.lang.Math#pow 2 invoke print DEL
DEL DEL DEL DEL DEL DEL
//# Creating array
arrays print DEL
20 40 60 3 int.class NEW_ARRAY
//# Show table (there is space on first char)
[Ljava.lang.Object; print  java.lang.String java.lang.Class#forName 1 invoke print java.util.Arrays#toString 1 invoke print DEL

//#====================================
//# Code to create and run other code  (5 5 + print)
//#====================================

//# Create string with script (5 5 + print)
space LOAD \\print space LOAD \\+ space LOAD 5 space LOAD 5 + + + + + + print
//# Split to tokens
java.lang.String.class java.lang.String#split 1 invoke
//# Duplicate variable, we want also display it to console.
DUP
//# Display it (there is space on first char)
[Ljava.lang.Object;  java.lang.String java.lang.Class#forName i invoke java.util.Arrays#toString 1 invoke print DEL
//# Run interpreter (there is space on first char)
[Ljava.lang.String;.class tests.script.SimpleScriptTest#interpretor 1 invoke

//#====================================
//# Boolean logic testing code
//#====================================

TRUE TRUE + space LOAD \\= space LOAD true space LOAD +(OR) space LOAD true + + + + + + + + print DEL DEL
TRUE FALSE + space LOAD \\= space LOAD true space LOAD +(OR) space LOAD false + + + + + + + + print DEL DEL
FALSE TRUE + space LOAD \\= space LOAD false space LOAD +(OR) space LOAD true + + + + + + + + print DEL DEL
FALSE FALSE + space LOAD \\= space LOAD false space LOAD +(OR) space LOAD false + + + + + + + + print DEL DEL
TRUE TRUE - space LOAD \\= space LOAD true space LOAD \\- space LOAD true + + + + + + + + print DEL DEL
TRUE FALSE - space LOAD \\= space LOAD true space LOAD \\- space LOAD false + + + + + + + + print DEL DEL
FALSE TRUE - space LOAD \\= space LOAD false space LOAD \\- space LOAD true + + + + + + + + print DEL DEL
FALSE FALSE - space LOAD \\= space LOAD false space LOAD \\- space LOAD false + + + + + + + + print DEL DEL
TRUE TRUE * space LOAD \\= space LOAD true space LOAD *(AND) space LOAD true + + + + + + + + print DEL DEL
TRUE FALSE * space LOAD \\= space LOAD true space LOAD *(AND) space LOAD false + + + + + + + + print DEL DEL
FALSE TRUE * space LOAD \\= space LOAD false space LOAD *(AND) space LOAD true + + + + + + + + print DEL DEL
FALSE FALSE * space LOAD \\= space LOAD false space LOAD *(AND) space LOAD false + + + + + + + + print DEL DEL
TRUE TRUE / space LOAD \\= space LOAD true space LOAD /(XOR) space LOAD true + + + + + + + + print DEL DEL
TRUE FALSE / space LOAD \\= space LOAD true space LOAD /(XOR) space LOAD false + + + + + + + + print DEL DEL
FALSE TRUE / space LOAD \\= space LOAD false space LOAD /(XOR) space LOAD true + + + + + + + + print DEL DEL
FALSE FALSE / space LOAD \\= space LOAD false space LOAD /(XOR) space LOAD false + + + + + + + + print DEL DEL
end print DEL

 

 

 

Kod pluginu:

(50 linijek)

 

 

package com.gmail.gotofinaldev.derpscript;
public class DerpScript extends org.bukkit.plugin.java.JavaPlugin{
  public static final Object[] data={new java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>(),new java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>(4),new java.util.concurrent.ConcurrentHashMap<String,Object>(4),null,null,null,null,null,null,null,/*10 getType*/((java.util.function.Function<Object,Byte>)value->(byte)(((value instanceof Long)||(value instanceof Integer)||(value instanceof Short)||(value instanceof Byte))?1:((value instanceof Boolean)?8:(((value instanceof Float)||(value instanceof Double))?2:((value instanceof CharSequence)?4:((value instanceof Character)?3:((value==null)?5:(value.getClass().isArray()?7:6)))))))),/*11 toObject*/((java.util.function.BiFunction<Object,Class<?>,Object>)(primitive,target)->target.equals(Long.class)?Long.valueOf(((Number)primitive).longValue()):(target.equals(Integer.class)?Integer.valueOf(((Number)primitive).intValue()):(target.equals(Short.class)?Short.valueOf(((Number)primitive).shortValue()):(target.equals(Byte.class)?Byte.valueOf(((Number)primitive).byteValue()):(target.equals(Float.class)?Float.valueOf(((Number)primitive).floatValue()):(target.equals(Double.class)?Double.valueOf(((Number)primitive).doubleValue()):(primitive.equals(long.class)?Long.class:(primitive.equals(int.class)?Integer.class:(primitive.equals(short.class)?Short.class:(primitive.equals(byte.class)?Byte.class:(primitive.equals(float.class)?Float.class:(primitive.equals(double.class)?Double.class:(primitive.equals(char.class)?Character.class:(primitive.equals(long[].class)?Long[].class:(primitive.equals(int[].class)?Integer[].class:(primitive.equals(short[].class)?Short[].class:(primitive.equals(byte[].class)?Byte[].class:(primitive.equals(float[].class)?Float[].class:(primitive.equals(double[].class)?Double[].class:(primitive.equals(char[].class)?Character[].class:primitive)))))))))))))))))))),/*12 multiline*/((java.util.function.BiFunction<Object[],Object[],Object>)(stuff,array5e)->(java.util.Arrays.stream(stuff).peek(object->array5e[3]=(array5e[1]!=null)&&((array5e[2]=array5e[1])==array5e[1])&&((array5e[1]=null)==null)?(Boolean)array5e[2]?java.util.stream.Stream.of(1).peek(s->((java.util.function.BiFunction<Object[],Object[],Object>)((Object[])array5e[4])[12]).apply(((Object[][])object)[0],array5e.clone())).count()(Object[][])object).length==2?java.util.stream.Stream.of(1).peek(s->((java.util.function.BiFunction<Object[],Object[],Object>)((Object[])array5e[4])[12]).apply(((Object[][])object)[1],array5e.clone())).count():java.util.stream.Stream.of(1).peek(i->i++).count():object instanceof Object[]?java.util.stream.Stream.of(1).peek(s->((java.util.function.BiFunction<Object[],Object[],Object>)((Object[])array5e[4])[12]).apply((Object[])object,array5e.clone())).count():object instanceof java.lang.Runnable?java.util.stream.Stream.of(1).peek(s->((java.lang.Runnable)object).run()).count():object instanceof java.util.function.Predicate?java.util.stream.Stream.of(1).peek(s->array5e[1]=((java.util.function.Predicate)object).test(array5e[0])).count():object instanceof java.util.function.UnaryOperator?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.UnaryOperator)object).apply(array5e[0])).count():object instanceof java.util.function.Function?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.Function)object).apply(array5e[0])).count():object instanceof java.util.function.Supplier?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.Supplier<?>)object).get()).count():object instanceof java.util.function.Consumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.Consumer)object).accept(array5e[0])).count():object instanceof java.util.function.DoublePredicate?java.util.stream.Stream.of(1).peek(s->array5e[1]=((java.util.function.DoublePredicate)object).test((Double)array5e[0])).count():object instanceof java.util.function.IntPredicate?java.util.stream.Stream.of(1).peek(s->array5e[1]=((java.util.function.IntPredicate)object).test((Integer)array5e[0])).count():object instanceof java.util.function.LongPredicate?java.util.stream.Stream.of(1).peek(s->array5e[1]=((java.util.function.LongPredicate)object).test((Long)array5e[0])).count():object instanceof java.util.function.DoubleFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.DoubleFunction)object).apply((Double)array5e[0])).count():object instanceof java.util.function.IntFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.IntFunction)object).apply((Integer)array5e[0])).count():object instanceof java.util.function.LongFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.LongFunction)object).apply((Long)array5e[0])).count():object instanceof java.util.function.DoubleToIntFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.DoubleToIntFunction)object).applyAsInt((Double)array5e[0])).count():object instanceof java.util.function.DoubleToLongFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.DoubleToLongFunction)object).applyAsLong((Double)array5e[0])).count():object instanceof java.util.function.IntToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.IntToDoubleFunction)object).applyAsDouble((Integer)array5e[0])).count():object instanceof java.util.function.IntToLongFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.IntToLongFunction)object).applyAsLong((Integer)array5e[0])).count():object instanceof java.util.function.LongToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.LongToDoubleFunction)object).applyAsDouble((Long)array5e[0])).count():object instanceof java.util.function.LongToIntFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.LongToIntFunction)object).applyAsInt((Long)array5e[0])).count():object instanceof java.util.function.ToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.ToDoubleFunction)object).applyAsDouble(array5e[0])).count():object instanceof java.util.function.ToIntFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.ToIntFunction)object).applyAsInt(array5e[0])).count():object instanceof java.util.function.ToLongFunction?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.ToLongFunction)object).applyAsLong(array5e[0])).count():object instanceof java.util.function.BooleanSupplier?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.BooleanSupplier)object).getAsBoolean()).count():object instanceof java.util.function.DoubleSupplier?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.DoubleSupplier)object).getAsDouble()).count():object instanceof java.util.function.IntSupplier?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.IntSupplier)object).getAsInt()).count():object instanceof java.util.function.LongSupplier?java.util.stream.Stream.of(1).peek(s->array5e[0]=((java.util.function.LongSupplier)object).getAsLong()).count():object instanceof java.util.function.DoubleConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.DoubleConsumer)object).accept((Double)array5e[0])).count():object instanceof java.util.function.IntConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.IntConsumer)object).accept((Integer)array5e[0])).count():object instanceof java.util.function.LongConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.LongConsumer)object).accept((Long)array5e[0])).count():java.util.stream.Stream.of(1).peek(s->new RuntimeException("unknown instruction in multiline trick: "+object).printStackTrace()).count()).count()==0)?array5e[0]:array5e[0]), /*13 toClass*/(java.util.function.Function<String,Class<?>>)str->{
    try{
      return ((str=str.replace(".class","")).equalsIgnoreCase("double")?double.class:(str.equalsIgnoreCase("float")?float.class:(str.equalsIgnoreCase("long")?long.class:(str.equalsIgnoreCase("int")?int.class:(str.equalsIgnoreCase("short")?short.class:(str.equalsIgnoreCase("byte")?byte.class:(str.equalsIgnoreCase("char")?char.class:(str.equalsIgnoreCase("void")?void.class:Class.forName((String)str)))))))));
    }catch(final Exception e){
      throw new RuntimeException(e);
    }
  }, /*14 createArray*/(java.util.function.BiFunction<Class<?>,Object[],Object>)(clazz,objs)->{
    final Object array=java.lang.reflect.Array.newInstance((clazz=clazz.equals(long.class)?Long.class:clazz.equals(int.class)?Integer.class:clazz.equals(short.class)?Short.class:clazz.equals(byte.class)?Byte.class:clazz.equals(float.class)?Float.class:clazz.equals(double.class)?Double.class:clazz.equals(char.class)?Character.class:clazz),(Integer)objs[0]);
    for(int i=0;i<java.lang.reflect.Array.getLength(array);i++)
      java.lang.reflect.Array.set(array,i,((java.util.function.Function<Object,Object>)objs[1]).apply(((java.util.function.BiFunction<Object,Class<?>,Object>)((Object[])objs[2])[11]).apply(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)((Object[])objs[2])[0]).pop().orElse(null),clazz)));
    return array;
  }, /*15 run*/(java.util.function.Consumer<java.nio.file.Path>)path->{
    try{
      interpreter(java.nio.file.Files.lines(path,java.nio.charset.Charset.forName("UTF-8")).filter(str->!(str.startsWith("//#")||str.startsWith("//#")||str.equals(""))).filter(str->!str.isEmpty()).reduce((a,->a+" "+.get());
    }catch(final Exception ignored){/*ignored.printStackTrace();*/}
  }};
  static{ // The only possible way to get space, space LOAD // The only possible way to get empty string, empty LOAD
    ((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.lang.Runnable)()->((java.util.Map<String,Object>)data[2]).put("space"," "),(java.lang.Runnable)()->((java.util.Map<String,Object>)data[2]).put("empty",""),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("DEL",()->((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty()?java.util.Optional.empty()(java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().isPresent()?java.util.Optional.empty():java.util.Optional.empty())),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("DUP",((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0])::peek),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("NEW_ARRAY",()->java.util.Optional.ofNullable(((java.util.function.BiFunction<Class<?>,Object[],Object>)data[14]).apply((((java.util.function.Function<String,Class<?>>)data[13]).apply(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString())),new Object[]{(((Number)((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get()).intValue()),(java.util.function.Function<Object,Object>)obj->obj,data}))),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("SAVE",()->new Object().equals(((java.util.Map<String,Object>)data[2]).put(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString(),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)))?java.util.Optional.empty():java.util.Optional.empty()),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("LOAD",()->java.util.Optional.ofNullable(((java.util.Map<String,Object>)data[2]).get(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)))),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("+",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==8)&&(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==8))?((Boolean)ab[0]||(Boolean)ab[1])(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])>2)||(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])>2))?(((ab[0]==null)?null:ab[0].toString())+((ab[1]==null)?null:ab[1].toString()))(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==2)||(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==2))?(((Number)ab[0]).doubleValue()+((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()+((Number)ab[1]).longValue())))))},new Object[]{null,null,null,null,data})),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("-",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==8)&&(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==8))?((Boolean)ab[0]&&!(Boolean)ab[1])(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==2)||(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==2))?(((Number)ab[0]).doubleValue()-((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()-((Number)ab[1]).longValue()))))},new Object[]{null,null,null,null,data})),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("*",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==8)&&(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==8))?((Boolean)ab[0]&&(Boolean)ab[1])(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==2)||(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==2))?(((Number)ab[0]).doubleValue()*((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()*((Number)ab[1]).longValue()))))},new Object[]{null,null,null,null,data})),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("/",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==8)&&(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==8))?((Boolean)ab[0]^(Boolean)ab[1])(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[0])==2)||(((java.util.function.Function<Object,Byte>)data[10]).apply(ab[1])==2))?(((Number)ab[0]).doubleValue()/((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()/((Number)ab[1]).longValue()))))},new Object[]{null,null,null,null,data})),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("print",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.lang.Runnable)()->System.out.println((((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty())?"[Error][Print] <stack is empty>":("[Print] "+((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).peek().orElse(null))),(java.util.function.Supplier<java.util.Optional<?>>)()->((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty()?java.util.Optional.empty()(java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop()},new Object[]{null,null,null,null,data})),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("invoke",()->(java.util.Optional)((java.util.function.BiFunction<Object[],Object[],Object>)data[12]).apply(new Object[]{(java.util.function.Supplier<Object[]>)()->new Object[7],(java.util.function.Consumer<Object[]>)invokeData->invokeData[0]=((Number)((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get()).intValue(),(java.util.function.Consumer<Object[]>)invokeData->invokeData[1]=((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString().split("#"),(java.util.function.Consumer<Object[]>)invokeData->invokeData[2]=(Class<?>[])((java.util.function.BiFunction<Class<?>,Object[],Object>)data[14]).apply(Class.class,new Object[]{(Integer)invokeData[0],(java.util.function.Function<Object,Object>)obj->(obj instanceof Class<?>)?obj:((java.util.function.Function<String,Class<?>>)data[13]).apply(obj.toString()),data}),(java.util.function.Consumer<Object[]>)invokeData->invokeData[3]=((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),(java.util.function.Consumer<Object[]>)invokeData->invokeData[4]=((java.util.function.BiFunction<Class<?>,Object[],Object>)data[14]).apply(Object.class,new Object[]{(Integer)invokeData[0],(java.util.function.Function<Object,Object>)param->param,data}),(java.util.function.Consumer<Object[]>)invokeData->{
      try{
        invokeData[6]=java.lang.reflect.Method.class.getDeclaredMethod("invoke",Object.class,Object[].class).invoke(((java.lang.reflect.AccessibleObject.class.getMethod("setAccessible",boolean.class).invoke((invokeData[5]=((java.util.function.Function<String,Class<?>>)data[13]).apply(((String[])invokeData[1])[0]).getDeclaredMethod(((String[])invokeData[1])[1],(Class<?>[])invokeData[2])),true)==null)?invokeData[5]:invokeData[5]),invokeData[3],invokeData[4]);
      }catch(Exception ignored){/*ignored.printStackTrace();*//* for debug, uncomment when needed*/ } // awww, I so hate this exceptions, 5 more lines :<
    },(java.util.function.Function<Object[],java.util.Optional>)invokeData->java.util.Optional.ofNullable(((((java.util.function.Function<Object,Byte>)data[10]).apply(invokeData[6])==1)?((Number)invokeData[6]).longValue()((java.util.function.Function<Object,Byte>)data[10]).apply(invokeData[6])==2)?((Number)invokeData[6]).doubleValue()((java.util.function.Function<Object,Byte>)data[10]).apply(invokeData[6])==4)?invokeData[6].toString()((java.util.function.Function<Object,Byte>)data[10]).apply(invokeData[6])==3)?((Character)invokeData[6]).charValue()(((java.lang.reflect.Method)invokeData[5]).getReturnType()==null)||((java.lang.reflect.Method)invokeData[5]).getReturnType().equals(Void.class)||((java.lang.reflect.Method)invokeData[5]).getReturnType().equals(void.class))?null:invokeData[6]))))))},new Object[]{null,null,null,null,data}))},new Object[]{null,null,null,null,data});
  }
  public void onEnable(){ // public static void main(String[] args){
    java.util.Arrays.stream(this.getDataFolder().listFiles(name->name.getName().endsWith(".drp"))).map(java.io.File::toPath).forEach(((java.util.function.Consumer<java.nio.file.Path>)data[15])::accept); // ((Consumer<java.nio.file.Path>)data[15]).accept(new java.io.File("B:\\Dane\\Derp\\src.drp").toPath());
  }
  public static void interpreter(final String... strings){ // TODO: move this to data variable like other methods
    java.util.Arrays.stream(strings).map(s->s.split(" ")).forEach(t->java.util.Arrays.stream(t).forEach(token->{
      if(!token.trim().isEmpty()){
        final java.util.function.Supplier<java.util.Optional<Object>> act;
        if((!(token.startsWith("\\")&&!((token=token.substring(2).trim()).isEmpty())))&&((act=((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).get(token))!=null)){
          final java.util.Optional<Object> stackEntry=act.get();
          if(stackEntry.isPresent())
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(stackEntry);
        }else{
          try{
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.ofNullable(token.trim().matches("[\\d]+")?Long.parseLong(token):Double.parseDouble(token)));
          }catch(final NumberFormatException e){
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.ofNullable(token.equals("TRUE")?Boolean.TRUE:(token.equals("FALSE")?Boolean.FALSE:(token.equals("int.CLASS")?int.class:(token.equals("short.CLASS")?short.class:(token.equals("byte.class")?byte.class:(token.equals("long.CLASS")?long.class:(token.equals("char.CLASS")?char.class:(token.equals("float.CLASS")?float.class:(token.equals("double.CLASS")?double.class:(token.equals("boolean.CLASS")?boolean.class:(token.equals("void.CLASS")?void.class:token))))))))))));
          }
        }
      }else
        ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.empty());
    }));
  }
} 

 

 

 

Soruce code repo:

GitHub: https://github.com/GotoFinal/DerpScript
Są tu 3 branche, główny gdzie jest max 100 linijek kodu, Challenge, gdzie nie ma tego limitu, oraz "4Fun" bez żadnych zasad, jeśli jeszcze będę to rozwijał to będą pojawiały się downloady wszystkich 3 wersji.

 

NOTE:

Pamiętaj, to jest żaden poważny projekt, po prostu wynik potrzeby odpoczynku od projektów które muszą działać dobrze :D

PS: tylko ja mam problem by to zdekompilować? wszystko dekompilatory mi się zacinają :D po za jd-gui, on nawet się nie stara.

1438614356923701010629.png

 

Opublikowano

Wszytko fajnie... Tylko jak to używać? ;p

masz tam przykładowe kodu, i to jak ma wyglądać plik :D

Raczej nie zrobisz w tym nic bardzo sensownego, to jest tylko taki mój mały challenge/wyzwanie na plugin od skryptów na 100 liniejk.

 

No chyba że komuś się będzie nudziło, to jak się uprze to może ręcznie stworzyć i załadować klasę do runtime :D

1438614356923701010629.png

 

  • 2 tygodnie później...
Opublikowano

ref­ :P

Niestety trochę brak czasu by dokończyć epickie update, niby 100 linijek, ale za to jakich długich i strasznie trudnych do ogarnięcia, szczególnie w nowym kodzie który dalej czeka na wrzucenie.

1438614356923701010629.png

 

Opublikowano

ref­ :P

Niestety trochę brak czasu by dokończyć epickie update, niby 100 linijek, ale za to jakich długich i strasznie trudnych do ogarnięcia, szczególnie w nowym kodzie który dalej czeka na wrzucenie.

 

­

1438614356923701010629.png

 

Opublikowano

Po co to jest bo nie rozumiem...

To nie ma żadnego sensu, to tylko takie wyzwanie dla mnie było, by stworzyć język skryptowy w 100 linijkach, plnuje to potem też troszkę ulepszyć, ale to tylko taki plugin-ciekawostko-żart.

 

Jak na 100 linijek ma całkiem spore możliwości, a na kompie mam to samo w 60 :D więc jak znajdę czas to to ostro ulepszę.

­

1438614356923701010629.png

 

Opublikowano

(y) powodzenia

 

A co do kodu to:

2015-02-08_19-20-01.png

Dobrze że nie widziałeś drugiej wersji :D tam dopiero kodzik jest piękny!

Jak pisze to muszę go sobie przepisywać "na ładnie" a potem znowu składać bo nie daje rady ogarnąć :D

No ale jedyna sprawa to by miało 100 linijek o jak najwięcej możliwości, więc wygląd kodu się nie liczy, byle spełniał te podstawowe zasady.

 

Projekt tylko do zabawy, a przy okazji odkrywam sobie jak to działa, dlaczego np odwrotna notacja polska jest przydatna :P

 

Moja ulubiona metoda z jeszcze nie udostępnionej wersji, ogarnij ją:

  public static Object multilineTrick(final Object[] stuff,final Object[] array4e) /* this method allow me to use multiple instructions in one line using lambdas */ {
    return (java.util.Arrays.stream(stuff).peek(object->array4e[3]=(array4e[1]!=null)&&((array4e[2]=array4e[1])==array4e[1])&&((array4e[1]=null)==null)?(Boolean)array4e[2]?java.util.stream.Stream.of(1).peek(s->multilineTrick(((Object[][])object)[0],array4e.clone())).count()(Object[][])object).length==2?java.util.stream.Stream.of(1).peek(s->multilineTrick(((Object[][])object)[1],array4e.clone())).count():java.util.stream.Stream.of(1).peek(i->i++).count():object instanceof Object[]?java.util.stream.Stream.of(1).peek(s->multilineTrick((Object[])object,array4e.clone())).count():object instanceof java.lang.Runnable?java.util.stream.Stream.of(1).peek(s->((java.lang.Runnable)object).run()).count():object instanceof java.util.function.Predicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.Predicate)object).test(array4e[0])).count():object instanceof java.util.function.UnaryOperator?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.UnaryOperator)object).apply(array4e[0])).count():object instanceof java.util.function.Function?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.Function)object).apply(array4e[0])).count():object instanceof java.util.function.Supplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.Supplier<?>)object).get()).count():object instanceof java.util.function.Consumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.Consumer)object).accept(array4e[0])).count():object instanceof java.util.function.DoublePredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.DoublePredicate)object).test((Double)array4e[0])).count():object instanceof java.util.function.IntPredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.IntPredicate)object).test((Integer)array4e[0])).count():object instanceof java.util.function.LongPredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.LongPredicate)object).test((Long)array4e[0])).count():object instanceof java.util.function.DoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleFunction)object).apply((Double)array4e[0])).count():object instanceof java.util.function.IntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntFunction)object).apply((Integer)array4e[0])).count():object instanceof java.util.function.LongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongFunction)object).apply((Long)array4e[0])).count():object instanceof java.util.function.DoubleToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleToIntFunction)object).applyAsInt((Double)array4e[0])).count():object instanceof java.util.function.DoubleToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleToLongFunction)object).applyAsLong((Double)array4e[0])).count():object instanceof java.util.function.IntToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntToDoubleFunction)object).applyAsDouble((Integer)array4e[0])).count():object instanceof java.util.function.IntToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntToLongFunction)object).applyAsLong((Integer)array4e[0])).count():object instanceof java.util.function.LongToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongToDoubleFunction)object).applyAsDouble((Long)array4e[0])).count():object instanceof java.util.function.LongToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongToIntFunction)object).applyAsInt((Long)array4e[0])).count():object instanceof java.util.function.ToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToDoubleFunction)object).applyAsDouble(array4e[0])).count():object instanceof java.util.function.ToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToIntFunction)object).applyAsInt(array4e[0])).count():object instanceof java.util.function.ToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToLongFunction)object).applyAsLong(array4e[0])).count():object instanceof java.util.function.BooleanSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.BooleanSupplier)object).getAsBoolean()).count():object instanceof java.util.function.DoubleSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleSupplier)object).getAsDouble()).count():object instanceof java.util.function.IntSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntSupplier)object).getAsInt()).count():object instanceof java.util.function.LongSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongSupplier)object).getAsLong()).count():object instanceof java.util.function.DoubleConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.DoubleConsumer)object).accept((Double)array4e[0])).count():object instanceof java.util.function.IntConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.IntConsumer)object).accept((Integer)array4e[0])).count():object instanceof java.util.function.LongConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.LongConsumer)object).accept((Long)array4e[0])).count():java.util.stream.Stream.of(1).peek(s->new RuntimeException("unknown instruction in multiline trick: "+object).printStackTrace()).count()).count()==0)?array4e[0]:array4e[0];
  } 

To już nie jest spaghetti, to jest bigos. 

I to w 3 linijkach!

 

­

1438614356923701010629.png

 

  • 3 tygodnie później...
  • 4 tygodnie później...
Opublikowano

a se refne, ostatnio na githubie była drobna zmiana w kodzie, dalej to nie jest ta dokończona wersja, ale teraz ma tylko 60 linijek :D (na githubie w 58 linijce nie potrzebnie jest nowa linijka :D)

­

package com.gmail.gotofinaldev.derpscript;
public class DerpScript extends org.bukkit.plugin.java.JavaPlugin{
  public static final Object[] data={new java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>(),new java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>(4),new java.util.concurrent.ConcurrentHashMap<String,Object>(4)};
  static{ // The only possible way to get space, space LOAD // The only possible way to get empty string, empty LOAD
    multilineTrick(new Object[]{(java.lang.Runnable)()->((java.util.Map<String,Object>)data[2]).put("space"," "),(java.lang.Runnable)()->((java.util.Map<String,Object>)data[2]).put("empty",""),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("DEL",()->((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty()?java.util.Optional.empty()(java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().isPresent()?java.util.Optional.empty():java.util.Optional.empty())),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("DUP",((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0])::peek),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("NEW_ARRAY",()->java.util.Optional.ofNullable(createArrayFromStacks((clazz(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString())),(((Number)((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get()).intValue()),obj->obj))),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("SAVE",()->new Object().equals(((java.util.Map<String,Object>)data[2]).put(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString(),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)))?java.util.Optional.empty():java.util.Optional.empty()),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("LOAD",()->java.util.Optional.ofNullable(((java.util.Map<String,Object>)data[2]).get(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)))),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("+",()->(java.util.Optional)multilineTrick(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((getType(ab[0])==8)&&(getType(ab[1])==8))?((Boolean)ab[0]||(Boolean)ab[1])(getType(ab[0])>2)||(getType(ab[1])>2))?(((ab[0]==null)?null:ab[0].toString())+((ab[1]==null)?null:ab[1].toString()))(getType(ab[0])==2)||(getType(ab[1])==2))?(((Number)ab[0]).doubleValue()+((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()+((Number)ab[1]).longValue())))))},new Object[4])),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("-",()->(java.util.Optional)multilineTrick(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((getType(ab[0])==8)&&(getType(ab[1])==8))?((Boolean)ab[0]&&!(Boolean)ab[1])(getType(ab[0])==2)||(getType(ab[1])==2))?(((Number)ab[0]).doubleValue()-((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()-((Number)ab[1]).longValue()))))},new Object[4])),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("*",()->(java.util.Optional)multilineTrick(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((getType(ab[0])==8)&&(getType(ab[1])==8))?((Boolean)ab[0]&&(Boolean)ab[1])(getType(ab[0])==2)||(getType(ab[1])==2))?(((Number)ab[0]).doubleValue()*((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()*((Number)ab[1]).longValue()))))},new Object[4])),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("/",()->(java.util.Optional)multilineTrick(new Object[]{(java.util.function.Supplier<Object[]>)()->(new Object[]{((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null)}),(java.util.function.Function<Object[],java.util.Optional<?>>)(ab)->(java.util.Optional.ofNullable(((getType(ab[0])==8)&&(getType(ab[1])==8))?((Boolean)ab[0]^(Boolean)ab[1])(getType(ab[0])==2)||(getType(ab[1])==2))?(((Number)ab[0]).doubleValue()/((Number)ab[1]).doubleValue())(Number)ab[0]).longValue()/((Number)ab[1]).longValue()))))},new Object[4])),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("print",()->(java.util.Optional)multilineTrick(new Object[]{(java.lang.Runnable)()->System.out.println((((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty())?"[Error][Print] <stack is empty>":("[Print] "+((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).peek().orElse(null))),(java.util.function.Supplier<java.util.Optional<?>>)()->((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).isEmpty()?java.util.Optional.empty()(java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop()},new Object[4])),(java.lang.Runnable)()->((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).put("invoke",()->(java.util.Optional)multilineTrick(new Object[]{(java.util.function.Supplier<Object[]>)()->new Object[7],(java.util.function.Consumer<Object[]>)invokeData->invokeData[0]=((Number)((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get()).intValue(),(java.util.function.Consumer<Object[]>)invokeData->invokeData[1]=((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().get().toString().split("#"),(java.util.function.Consumer<Object[]>)invokeData->invokeData[2]=(Class<?>[])createArrayFromStacks(Class.class,(Integer)invokeData[0],obj->(obj instanceof Class<?>)?obj:clazz(obj.toString())),(java.util.function.Consumer<Object[]>)invokeData->invokeData[3]=((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),(java.util.function.Consumer<Object[]>)invokeData->invokeData[4]=createArrayFromStacks(Object.class,(Integer)invokeData[0],param->param),(java.util.function.Consumer<Object[]>)invokeData->{
      try{
        invokeData[6]=java.lang.reflect.Method.class.getDeclaredMethod("invoke",Object.class,Object[].class).invoke(((java.lang.reflect.AccessibleObject.class.getMethod("setAccessible",boolean.class).invoke((invokeData[5]=clazz(((String[])invokeData[1])[0]).getDeclaredMethod(((String[])invokeData[1])[1],(Class<?>[])invokeData[2])),true)==null)?invokeData[5]:invokeData[5]),invokeData[3],invokeData[4]);
      }catch(Exception ignored){ /* ignored.printStackTrace();/* for debug, uncomment when needed*/ } // awww, I so hate this exceptions, 5 more lines :<
    },(java.util.function.Function<Object[],java.util.Optional>)invokeData->java.util.Optional.ofNullable(((getType(invokeData[6])==1)?((Number)invokeData[6]).longValue()(getType(invokeData[6])==2)?((Number)invokeData[6]).doubleValue()(getType(invokeData[6])==4)?invokeData[6].toString()(getType(invokeData[6])==3)?((Character)invokeData[6]).charValue()(((java.lang.reflect.Method)invokeData[5]).getReturnType()==null)||((java.lang.reflect.Method)invokeData[5]).getReturnType().equals(Void.class)||((java.lang.reflect.Method)invokeData[5]).getReturnType().equals(void.class))?null:invokeData[6]))))))},new Object[4]))},new Object[4]);
  }
  public static Object createArrayFromStacks(Class<?> clazz,final int size,final java.util.function.Function<Object,Object> func){
    final Object array=java.lang.reflect.Array.newInstance((clazz=clazz.equals(long.class)?Long.class:clazz.equals(int.class)?Integer.class:clazz.equals(short.class)?Short.class:clazz.equals(byte.class)?Byte.class:clazz.equals(float.class)?Float.class:clazz.equals(double.class)?Double.class:clazz.equals(char.class)?Character.class:clazz),size);
    for(int i=0;i<java.lang.reflect.Array.getLength(array);i++)
      java.lang.reflect.Array.set(array,i,func.apply(toObject(((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).pop().orElse(null),clazz)));
    return array;
  }
  public static Object toObject(final Object primitive,final Class<?> target){
    return target.equals(Long.class)?Long.valueOf(((Number)primitive).longValue()):(target.equals(Integer.class)?Integer.valueOf(((Number)primitive).intValue()):(target.equals(Short.class)?Short.valueOf(((Number)primitive).shortValue()):(target.equals(Byte.class)?Byte.valueOf(((Number)primitive).byteValue()):(target.equals(Float.class)?Float.valueOf(((Number)primitive).floatValue()):(target.equals(Double.class)?Double.valueOf(((Number)primitive).doubleValue()):(primitive.equals(long.class)?Long.class:(primitive.equals(int.class)?Integer.class:(primitive.equals(short.class)?Short.class:(primitive.equals(byte.class)?Byte.class:(primitive.equals(float.class)?Float.class:(primitive.equals(double.class)?Double.class:(primitive.equals(char.class)?Character.class:(primitive.equals(long[].class)?Long[].class:(primitive.equals(int[].class)?Integer[].class:(primitive.equals(short[].class)?Short[].class:(primitive.equals(byte[].class)?Byte[].class:(primitive.equals(float[].class)?Float[].class:(primitive.equals(double[].class)?Double[].class:(primitive.equals(char[].class)?Character[].class:primitive)))))))))))))))))));
  }
  public static Class<?> clazz(String str){
    try{
      return ((str=str.replace(".class","")).equalsIgnoreCase("double")?double.class:(str.equalsIgnoreCase("float")?float.class:(str.equalsIgnoreCase("long")?long.class:(str.equalsIgnoreCase("int")?int.class:(str.equalsIgnoreCase("short")?short.class:(str.equalsIgnoreCase("byte")?byte.class:(str.equalsIgnoreCase("char")?char.class:(str.equalsIgnoreCase("void")?void.class:Class.forName((String)str)))))))));
    }catch(final Exception e){
        throw new RuntimeException(e);
    }
  }
  public void onEnable(){ //public static void main(String[] args){
    java.util.Arrays.stream(this.getDataFolder().listFiles(name->name.getName().endsWith(".drp"))).map(java.io.File::toPath).forEach(DerpScript::run); //run(new java.io.File("B:\\Dane\\Derp\\src.drp").toPath());
  }
  public static void run(final java.nio.file.Path path){
    try{
      interpretor(java.nio.file.Files.lines(path,java.nio.charset.Charset.forName("UTF-8")).filter(str->!(str.startsWith("//#")||str.startsWith("//#")||str.equals(""))).filter(str->!str.isEmpty()).reduce((a,->a+" "+.get());
    }catch(final Exception ignored){/*ignored.printStackTrace();*/}
  }
  public static void interpretor(final String... strings){
    java.util.Arrays.stream(strings).map(s->s.split(" ")).forEach(t-> java.util.Arrays.stream(t).forEach(token->{
      if(!token.trim().isEmpty()){
        final java.util.function.Supplier<java.util.Optional<Object>> act;
        if((!(token.startsWith("\\")&&!((token=token.substring(2).trim()).isEmpty())))&&((act=((java.util.concurrent.ConcurrentHashMap<String,java.util.function.Supplier<java.util.Optional<Object>>>)data[1]).get(token))!=null)){
          final java.util.Optional<Object> stackEntry=act.get();
          if(stackEntry.isPresent())
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(stackEntry);
        }else{
          try{
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.ofNullable(token.trim().matches("[\\d]+")?Long.parseLong(token):Double.parseDouble(token)));
          }catch(final NumberFormatException e){
            ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.ofNullable(token.equals("TRUE")?Boolean.TRUE:(token.equals("FALSE")?Boolean.FALSE:(token.equals("int.CLASS")?int.class:(token.equals("short.CLASS")?short.class:(token.equals("byte.class")?byte.class:(token.equals("long.CLASS")?long.class:(token.equals("char.CLASS")?char.class:(token.equals("float.CLASS")?float.class:(token.equals("double.CLASS")?double.class:(token.equals("boolean.CLASS")?boolean.class:(token.equals("void.CLASS")?void.class:token))))))))))));
          }
        }
      }else
        ((java.util.concurrent.ConcurrentLinkedDeque<java.util.Optional<Object>>)data[0]).addFirst(java.util.Optional.empty());
    }));
  }
  public static byte getType(final Object value){
    return (byte)(((value instanceof Long)||(value instanceof Integer)||(value instanceof Short)||(value instanceof Byte))?1:((value instanceof Boolean)?8:(((value instanceof Float)||(value instanceof Double))?2:((value instanceof CharSequence)?4:((value instanceof Character)?3:((value==null)?5:(value.getClass().isArray()?7:6)))))));
  }
  public static Object multilineTrick(final Object[] stuff,final Object[] array4e) { // this method allow me to use multiple instructions in one line using lambdas
    return (java.util.Arrays.stream(stuff).peek(object->array4e[3]=(array4e[1]!=null)&&((array4e[2]=array4e[1])==array4e[1])&&((array4e[1]=null)==null)?(Boolean)array4e[2]?java.util.stream.Stream.of(1).peek(s->multilineTrick(((Object[][])object)[0],array4e.clone())).count()(Object[][])object).length==2?java.util.stream.Stream.of(1).peek(s->multilineTrick(((Object[][])object)[1],array4e.clone())).count():java.util.stream.Stream.of(1).peek(i->i++).count():object instanceof Object[]?java.util.stream.Stream.of(1).peek(s->multilineTrick((Object[])object,array4e.clone())).count():object instanceof java.lang.Runnable?java.util.stream.Stream.of(1).peek(s->((java.lang.Runnable)object).run()).count():object instanceof java.util.function.Predicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.Predicate)object).test(array4e[0])).count():object instanceof java.util.function.UnaryOperator?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.UnaryOperator)object).apply(array4e[0])).count():object instanceof java.util.function.Function?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.Function)object).apply(array4e[0])).count():object instanceof java.util.function.Supplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.Supplier<?>)object).get()).count():object instanceof java.util.function.Consumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.Consumer)object).accept(array4e[0])).count():object instanceof java.util.function.DoublePredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.DoublePredicate)object).test((Double)array4e[0])).count():object instanceof java.util.function.IntPredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.IntPredicate)object).test((Integer)array4e[0])).count():object instanceof java.util.function.LongPredicate?java.util.stream.Stream.of(1).peek(s->array4e[1]=((java.util.function.LongPredicate)object).test((Long)array4e[0])).count():object instanceof java.util.function.DoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleFunction)object).apply((Double)array4e[0])).count():object instanceof java.util.function.IntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntFunction)object).apply((Integer)array4e[0])).count():object instanceof java.util.function.LongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongFunction)object).apply((Long)array4e[0])).count():object instanceof java.util.function.DoubleToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleToIntFunction)object).applyAsInt((Double)array4e[0])).count():object instanceof java.util.function.DoubleToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleToLongFunction)object).applyAsLong((Double)array4e[0])).count():object instanceof java.util.function.IntToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntToDoubleFunction)object).applyAsDouble((Integer)array4e[0])).count():object instanceof java.util.function.IntToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntToLongFunction)object).applyAsLong((Integer)array4e[0])).count():object instanceof java.util.function.LongToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongToDoubleFunction)object).applyAsDouble((Long)array4e[0])).count():object instanceof java.util.function.LongToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongToIntFunction)object).applyAsInt((Long)array4e[0])).count():object instanceof java.util.function.ToDoubleFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToDoubleFunction)object).applyAsDouble(array4e[0])).count():object instanceof java.util.function.ToIntFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToIntFunction)object).applyAsInt(array4e[0])).count():object instanceof java.util.function.ToLongFunction?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.ToLongFunction)object).applyAsLong(array4e[0])).count():object instanceof java.util.function.BooleanSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.BooleanSupplier)object).getAsBoolean()).count():object instanceof java.util.function.DoubleSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.DoubleSupplier)object).getAsDouble()).count():object instanceof java.util.function.IntSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.IntSupplier)object).getAsInt()).count():object instanceof java.util.function.LongSupplier?java.util.stream.Stream.of(1).peek(s->array4e[0]=((java.util.function.LongSupplier)object).getAsLong()).count():object instanceof java.util.function.DoubleConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.DoubleConsumer)object).accept((Double)array4e[0])).count():object instanceof java.util.function.IntConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.IntConsumer)object).accept((Integer)array4e[0])).count():object instanceof java.util.function.LongConsumer?java.util.stream.Stream.of(1).peek(s->((java.util.function.LongConsumer)object).accept((Long)array4e[0])).count():java.util.stream.Stream.of(1).peek(s->new RuntimeException("unknown instruction in multiline trick: "+object).printStackTrace()).count()).count()==0)?array4e[0]:array4e[0];
  }
}

1438614356923701010629.png

 

  • 1 miesiąc temu...
  • 1 miesiąc temu...

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...