Back to The tech awesomeness
Table of contents
Java chapters

The article for today.


public class PartRecomposerTest23985678234765 {
    public static void main(String[] args) throws ScriptException {
        PartRecomposerTest23985678234765 t =
                new PartRecomposerTest23985678234765();
        
        Part parts = t.new Number(0);
        parts.part(t.new Number(2));
        parts.part(t.new Sum());
        parts.part(t.new Number(2));
        parts.part(t.new Equals());
        
        String formula = parts.compile();
        for (Part part : parts.getParts()) {
            System.out.println(part.getVal());
        }
        System.out.println(formula);
        
        //if (parts contains Equals and
        //Equals getEqualsEngine equals ScriptEngineManager )
        
        //    ScriptEngineManager mgr = new ScriptEngineManager();
        //    ScriptEngine engine = mgr.getEngineByName("JavaScript");

        //    System.out.println(engine.eval(formula));
    } 
    
    abstract class Part {
        private List < Part > parts = new ArrayList < >();
        public Part part(final Part part) {
            parts.add(part);
            return this;
        }
        public List < Part > getParts () {
            return parts;
        }
        abstract public String getVal();
        public String compile() {
            String result = "";
            for (Part part: parts) {
                result += part.getVal();
                //result += innerCompile(part, result);
            }
            
            return result;
        }
    }
    
    static String innerCompile(Part part, String result) {
        if (!part.getParts().isEmpty()) {
            for (Part innerPart: part.getParts()) {
                    result += innerPart.getVal();
                    result += innerCompile(innerPart, result);
            }
        } 
        return result;
    }
    
    class Number extends Part {
        private int val;

        public Number(int val) {
            this.val = val;
        }
        
        @Override
        public String getVal() {
            return ""+val;
        }

        public void setVal(int val) {
            this.val = val;
        }
    }
    
    class Operator extends Part {
        private String val;
        @Override
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
    }
    
    class Sum extends Operator {
        private String val = "+";
        @Override
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
    }
    
    class Equals extends Operator {
        private String val = "=";
        @Override
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
        
        Class getEqualsEngine() {
            return ScriptEngineManager.class;
        }
    }
    
    class RandomEquals extends Equals {
        private String val = "random=";//so that 1+1=random and others
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
        
        Class getEqualsEngine() {
            return RandomScriptEngineManager.class;
        }
    }
    
    class RandomScriptEngineManager {}
    
    class SmartEquals extends Equals {
        private String val = "smart="; //so that 1=3 and others
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
        
        Class getEqualsEngine() {
            return SmartScriptEngineManager.class;
        }
    }

    class BusinessEquals extends SmartEquals {
        private String val = "business="; //so that 1+1=300 and others
        public String getVal() {
            return val;
        }

        public void setVal(String val) {
            this.val = val;
        }
        
        Class getEqualsEngine() {
            return BusinessScriptEngineManager.class;
        }
    }
    
    class BusinessScriptEngineManager {}
    class SmartScriptEngineManager {}
}

If you let me unopen a bit that SmartEquals class with "so that 1=3 and others" comment, I will do it.

The concept of smart equality I derived by extending the concept of +=, ++ from c++ like programming languages. In what it means by i += i; i++.

In scope of smart equality, the = sign means it implies more that regular equality in its strict sense. It also implies, that it has more in it than just visually visible.

How comes, that it can 1=3 in that scope:

There a lot of options for smart equality there:

1 (+1+1)= 3

1 (+3-1)= 3

and so on.

The actual magical action certainly holds within in that peculiar SmartScriptEngineManager class.

Probably the ideal implementation can provide close to infinite variation for such smart equality substitutions. I did not check on that, apologies.

So there it is better to have some definable limit for amount of available options for provision by SmartScriptEngineManager class.

But the real fun and sadness appears when that particular implementation of SmartScriptEngineManager class provides formulas with variables.

For example, x2 - 4 = 0, where the solutions are x1 = 2 x2 = -2. Not mentioning more power of n for variable x equations, where there are more than one, two solutions.

So some implementations of SmartScriptEngineManager class can provide strict and non strict solutions with dependance on the implementations. That possibility returns me back or forward to case.

Перескладач частинок для іншого застосунку.


відкрито клас ПеревіркаПерескладачаЧастинок23985678234765 {
    відкрито незмінно вакантно переважний(Рядок[] деталі) надсилає СценарнеВиключення {
        //...
    }

    клас РозумнеДорівнення розширює Дорівнення {
        зачинено Рядок значення = "розумне="; //так що 1=3 й інші
        відкрито Рядок отриматиЗначення() {
            повернути значення;
        }

        відкрито вакантно надатиЗначення(Рядок значення) {
            це.значення = значення;
        }
        
        Клас отриматиРушійДорівнення() {
            повернути РозумнийСценарійнийРушійнийКерівник.клас;
        }
    }

    клас ЗайнятеДорівнення розширює РозумнеДорівнення {
        зачинено Рядок значення = "зайняте="; //так що 1+1=300 й інші
        відкрито Рядок отриматиЗначення() {
            повернути значення;
        }

        відкрито вакантно надатиЗначення(Рядок значення) {
            це.значення = значення;
        }
        
        Клас отриматиРушійДорівнення() {
            повернути ЗайнятийСценарійнийРушійнийКерівник.клас;
        }
    }
    
    клас ЗайнятийСценарійнийРушійнийКерівник {}
    клас РозумнийСценарійнийРушійнийКерівник {}
}

Якщо ви озволите мені відчинити дещо той класс РозумнеДорівнення з "так що 1=3 й інші" коментарем, я зроблю таким чином.

Концепцію розмного дорівняння я вивів розшурюючи концепцію +=, ++ з c++ подібним мов програмування. У яких воно позначається i += i; i++.

У межах розумного дорівняння, = символ позначає, що він натякає на більш ніж звичайне рівняння у його вимогливому значенні. Він також натякає, що він має більше в собі ніж щойно візуально видкий символ.

Як трапляється, що може бути 1=3 у тих межах:

Є багато варьянтів для розумного дорівняння он там на тому:

1 (+1+1)= 3

1 (+3-1)= 3

й так далі.

Справжня дієва магічна дія аякже тримається всередині того своєрідного класу РозумнийСценарійнийРушійнийКерівник.

Ймовірно ідеальне виконання може надавати близко до нескінченності варіаційдля подібних заміщень розумних дорівнянь. Я не перевіряв на цьому, перепрошення.

Так що там краще мати деяке обмеження для визначення для кількості доступних варьянтів для надання класом РозумнийСценарійнийРушійнийКерівник.

Але дійсний веселощі і сум з'являються коли те особливе виконання класа РозумнийСценарійнийРушійнийКерівник надає формули зі змінними.

Наприклад, x2 - 4 = 0, де ріщеннями є x1 = 2 x2 = -2. Не згадуючи більше рівнянь з формулами зі змінними у ступіні n, де існує більше ніж одне, два рішення.

Так що деякі виконання класу РозумнийСценарійнийРушійнийКерівник можуть надавати вимогливі і невимогливі рішення з залежністю від виконання наразі. Та можливість повертає мене назад чи уперед до випадку.