Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/16: Рейтинг темы: голосов - 16, средняя оценка - 4.50
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Clojure Реализация интерфейса Liscript интерпретатора

12.01.2016, 17:04. Показов 4138. Ответов 57
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Пишу GUI приложение. В перспективе хочу портировать на Андроид, но поскольку с Java не сталкивался, решил сначала написать десктопный вариант. Хотел сделать простой РЕПЛ - одно окно, вопрос-ответ с компом... Но чтобы длинный код не стирался каждый раз, вынес код в отдельное окно - можно многократно запускать, результат выводится в окне вывода. Код по флажку можно стирать (как в аське например) или оставлять (как в любой ИДЕ). Но теперь встал вопрос - где вводить запрашиваемые при работе кода данные? Сейчас читаются из окна кода, значит код приходится стирать Логично читать или из третьего окна, или из окна вывода - как в стандартных аналогах. Но это уже не РЕПЛ ). У меня можно открывать много закладок с подобным интерфейсом. Что посоветуете? Или вообще сделать 2 вида интерфейса закладок - ИДЕ/гиттер и РЕПЛ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.01.2016, 17:04
Ответы с готовыми решениями:

Реализация интерпретатора Prolog
Всем доброго времени суток. Вопрос такой: где можно найти реализацию интерпретатора Prolog? Желательно с комментариями, конечно. ...

Реализация команд для своего командного интерпретатора
namespace Commands { class Program { static void Main() { while (true) ...

Clojure Реализация функций RANK и INTERSECTION
Здравствуйте, извините, возможно я уже утомил вас вопросами. Дело в том что все функции которые я пишу неверны, ибо я не понимаю как их...

57
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 01:17  [ТС]
Студворк — интернет-сервис помощи студентам
nullxdth, да, все началось (и пока не закончилось) портировать его на Андроид. По сравнению с хаскельным вариантом пришлось писать автоматическую ТСО ну и синтаксис/типы немного расширить. И GUI прикрутить.

Добавлено через 2 минуты
nullxdth, насчет последнего предложения - очень интересно. Могу выложить исходники на Java, хаскельные уже выложены но могу их допилить до совместимости с джавовскими - чтобы совпадали синтаксис и семантика. Но если позволите, этим займусь не сегодня - сейчас все-таки хочу найти куда выложить готовое приложение.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 01:23
Цитата Сообщение от _Ivana Посмотреть сообщение
Могу выложить исходники на Java, хаскельные уже выложены но могу их допилить до совместимости с джавовскими - чтобы совпадали синтаксис и семантика.
Да я думаю лучше над одной реализацией сосредоточиться. Если уж хочется на android что-то там иметь, то имеет смысл Java реализацию пилить.

Добавлено через 55 секунд
Цитата Сообщение от _Ivana Посмотреть сообщение
Но если позволите, этим займусь не сегодня - сейчас все-таки хочу найти куда выложить готовое приложение.
Да конечно. Какие вопросы. Делайте всё в своём ритме.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 01:38  [ТС]
nullxdth, мне интересно ваше предложение. Готов предоставить все мои джавовские исходники. Если оставить в стороне утилитарные классы, обслуживающие GUI - формы/кнопки/закладки, подсветка синтаксиса и библиотечных функций и констант (!), парных скобок и т.п. (не знаю, нужно ли вам это), то остается пара-тройка классов собственно интерпретатора. Запускать в отдельном Java-потоке, передавать параметром по ссылке любой класс, реализующий интерфейс, который я назвал InOutable - чтобы были 2 метода - блокирующий ввод in и неблокирующий вывод out. А откуда их брать - уже не забота собственно интерпретатора.

Добавлено через 9 минут
Не хочет сорсфорж регистрировать мой имэйл, поэтому вот так - дешево и сердито http://tempfile.ru/file/3171098
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 01:45
Цитата Сообщение от _Ivana Посмотреть сообщение
Если оставить в стороне утилитарные классы, обслуживающие GUI - формы/кнопки/закладки, подсветка синтаксиса и библиотечных функций и констант (!), парных скобок и т.п. (не знаю, нужно ли вам это)
Нет, не важно. Я всё равно не смогу этим воспользоваться. К сожалению, полностью прилип к Emacs. Мне кажется это стоит вообще делать как отельный проект - IDE для языка.
Цитата Сообщение от _Ivana Посмотреть сообщение
Запускать в отдельном Java-потоке, передавать параметром по ссылке любой класс, реализующий интерфейс, который я назвал InOutable - чтобы были 2 метода - блокирующий ввод in и неблокирующий вывод out. А откуда их брать - уже не забота собственно интерпретатора.
Это почти то, что нужно. Могу посмотреть и попробовать что-нибудь сделать с этим.
Кстати, если не хочется по началу открывать исходники, можно на bitbucket сделать приватный репозиторий (на сколько я помню, там бесплатно).

Добавлено через 3 минуты
Цитата Сообщение от _Ivana Посмотреть сообщение
Не хочет сорсфорж регистрировать мой имэйл, поэтому вот так - дешево и сердито
Скачал. Работает
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 01:50  [ТС]
Битбакет осваивать... Проще так (хотя это будет правиться неоднократно и сильно):
Кликните здесь для просмотра всего текста

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package com.company;
 
 
import java.util.HashMap;
 
public class Env {
    public HashMap<String, Object> map;
    public Env parent;
 
    Env (HashMap<String, Object> m, Env p) { map = m; parent = p; }
 
    public static void setVar(Env env, String var, Object value) {
        //if (env != null) {
        //    if (env.map.containsKey(var)) env.map.put(var, value);
        //    else setVar(env.parent, var, value);
        //}
 
        Env curenv = env;
        while (curenv != null) {
            if (curenv.map.containsKey(var)) {curenv.map.put(var, value); break;}
            curenv = curenv.parent;
        }
    }
 
    public static Object getVar(Env env, String var) {
        //return env == null ? var : env.map.containsKey(var) ? env.map.get(var) :
        // getVar(env.parent, var);
 
        Env curenv = env;
        while (curenv != null) {
            if (curenv.map.containsKey(var)) return curenv.map.get(var);
            curenv = curenv.parent;
        }
        return var;
    }
 
    public static void defVar(Env env, String var, Object value) {
        if (env != null) env.map.put(var, value);
    }
 
    public static boolean isBounded(Env env, String var) {
        Env curenv = env;
        while (curenv != null) {
            if (curenv.map.containsKey(var)) return true;
            curenv = curenv.parent;
        }
        return false;
    }
}
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
package com.company;
 
import com.company.Eval.ConsList;
 
import java.util.LinkedList;
 
public class Read {
 
    public static LinkedList<String> tokens_(String s) {
        LinkedList<String> r = new LinkedList<String>();
 
        String t = "";
        Integer lev = 0;
        boolean f = false;
        for (Character c : (s + " ").toCharArray()) {
            if (c.toString().trim().isEmpty()) {}//continue;
            else if (c == '(' && !f) lev += 1;
            else if (c == ')' && !f) lev -= 1;
            else if (c == '"') f = !f;
 
            t += c.toString();
            if (    lev == 0 &&
                    !t.trim().isEmpty() &&
                    (c.toString().trim().isEmpty() || c == ')') &&
                    !f) {
                if (!t.trim().isEmpty()) r.add(t.trim());
                t = "";
                f = false;
            }
        }
        return r;
    }
 
    public static void addToken(LinkedList<String> r, String s) {
        if(!r.isEmpty() && r.getLast().equals("\'")) {
            r.remove(r.size()-1);
            r.add("\'" + s);
        } else r.add(s);
    }
 
    public static LinkedList<String> tokens(String s) {
        LinkedList<String> r = new LinkedList<String>();
 
        int STATE_TOKEN = 0, STATE_STRING = 2, STATE_COMMENT = 3;
        int state = STATE_TOKEN;
        int ifrom = 0, ito = s.length(), ib = ifrom, lev = 0;
 
        for (int i = ifrom; i <= ito; ++i) {
            char c = i < ito ? s.charAt(i) : 0;
 
            if (state == STATE_STRING &&
                    //(c == '"' || c == '\n' || c == 0)) {
                    (c == '"' || c == 0)) {
                if (lev == 0) {
                    addToken(r, s.substring(ib, i + 1));
                    ib = i + 1;
                }
                state = STATE_TOKEN;
            }
            else if (state == STATE_COMMENT &&
                    //(c == ';' || c == '\n' || c == 0)) {
                    (c == ';' || c == 0)) {
                if (lev == 0) {
                    //r.add(s.substring(ib, i + 1));
                    ib = i + 1;
                }
                state = STATE_TOKEN;
            }
            else if (state == STATE_TOKEN) {
                if (c == ')') lev -= 1;
                if (lev == 0 &&
                        (Character.isWhitespace(c) || c == '(' || c == ')'
                                || c == '"' || c == ';' || c == 0) ) {
                    int ie = c == ')' ? i+1 : i;
                    if (ie>ib) addToken(r, s.substring(ib, ie));
                    ib = ie;
                    if (Character.isWhitespace(c)) ib += 1;
                }
                if (c == '(') lev += 1;
                else if (c == '"') state = STATE_STRING;
                else if (c == ';') state = STATE_COMMENT;
            }
        }
        return r;
    }
 
    private static Object readToken(String t) {
        int length = t.length();
        char fst = t.charAt(0), lst = t.charAt(length - 1);
        if (fst == '(' && lst == ')') {
            //return tokens2ConsList(tokens(t.substring(1, length - 1)));
 
            String subt = t.substring(1, length - 1);
            ConsList p = tokens2ConsList(tokens(subt));
            if (subt.contains("\n")) p.s = subt;
            return p;
        } else if (fst == '"' && lst == '"')
            //return t.substring(1, length - 1);
            return new Eval.RawString(t.substring(1, length - 1));
        else if (fst == '\'') {
            Object v = tokens2LispVal(tokens(t.substring(1, length)));
            return new ConsList("quote", new ConsList(v, Eval.emptyList)); }
        else if (t.equals("true")) return true;
        else if (t.equals("false")) return false;
        else
            try {return new Integer(t);}
            catch (NumberFormatException errorInteger) {
                try {return new Double(t);}
                catch (NumberFormatException errorDouble) {return t;}
            }
    }
 
    private static ConsList tokens2ConsList(LinkedList<String> ts) {
        if (ts.isEmpty()) return Eval.emptyList;
        else {
            String h = ts.removeFirst();
            return new ConsList(readToken(h), tokens2ConsList(ts));
        }
    }
 
    public static Object tokens2LispVal(LinkedList<String> ts) {
        if (ts.size()==1) return readToken(ts.getFirst());
        else return tokens2ConsList(ts);
    }
}
Java
1
2
3
........
Object lv = Read.tokens2LispVal(Read.tokens(expression));
pane.out(true, Eval.eval(0, true, pane, globalEnv, lv).toString());
........[/JAVA]


Файл то по ссылке выше скачивается? Что-то тот хостинг не внушает мне доверия..

Добавлено через 55 секунд
Класс Эвал не влез - 22000 символов из 15000 максимальных в одном посте форума
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 01:51
Цитата Сообщение от _Ivana Посмотреть сообщение
Файл то по ссылке выше скачивается? Что-то тот хостинг не внушает мне доверия..
Скачивается. Уже скачал.

Добавлено через 16 секунд
Цитата Сообщение от _Ivana Посмотреть сообщение
Класс Эвал не влез - 22000 символов из 15000 максимальных в одном посте форума
Пришлите на multimethod@yandex.ru
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 01:52  [ТС]
Класс Эвал не влез - 22000 символов из 15000 максимальных в одном посте форума
Цитата Сообщение от nullxdth Посмотреть сообщение
Скачал. Работает
Тогда с вас помидоры, желательно конструктивные
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:02
Цитата Сообщение от _Ivana Посмотреть сообщение
Тогда с вас помидоры, желательно конструктивные
Пока ничего не понял. Доки в текстовиках не читал. Первое что заметил: utf-8 не работает, расширения файлов исходников как "*.txt".
Миниатюры
Clojure Реализация интерфейса Liscript интерпретатора  
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 02:06  [ТС]
Запустите хотя бы первую пару демо примеров - у меня нет функций или особых форм let | list (очень надеюсь, что вы не будете ругаться, что это не совсем лисп ) Он не знает икс и вычисляет его автоцитированием в него же. А потом не может сложить символ с 1. А расширения можно поменять, это дело 10-е...
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:13
Цитата Сообщение от _Ivana Посмотреть сообщение
Он не знает икс и вычисляет его автоцитированием в него же.
Понятно. Но на мой взгляд это нужно будет исправить, иначе будет тяжело отлаживать. Поведение разное в зависимости от того, определена переменная или нет. Наверное лучше валиться с "unbound variable".

Добавлено через 31 секунду
Цитата Сообщение от _Ivana Посмотреть сообщение
А расширения можно поменять, это дело 10-е...
Согласен. Я просто рассказал, что первое бросилось в глаза
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 02:14  [ТС]
Да я могу сделать как в 1С - пытаться прочитать все как число, а если не получается - считать нулем А можно и свои осмысленные тексты рантайм-эксепшн исключений для таких случаев написать.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:16
Цитата Сообщение от _Ivana Посмотреть сообщение
особых форм let | list (очень надеюсь, что вы не будете ругаться, что это не совсем лисп )
А в дальнейшем предполагаете иметь лексические связывания (локальные переменные)? Или это идеологически не предполагается?

Добавлено через 1 минуту
Цитата Сообщение от _Ivana Посмотреть сообщение
Да я могу сделать как в 1С - пытаться прочитать все как число, а если не получается - считать нулем
Нет, не думаю, что стоит
Цитата Сообщение от _Ivana Посмотреть сообщение
А можно и свои осмысленные тексты рантайм-эксепшн исключений для таких случаев написать.
А вот это как раз правильно направление.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 02:18  [ТС]
Они есть. И связываются теми же def | set! | get - в каком кадре окружения они вызваны, в том и работают. Посмотрите код демо-примеров.

Добавлено через 1 минуту
Сделаю ка я себе уже TODO файлик. И первым пунктом будут осмысленные тексты рантайм-эксепшнов.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:21
Цитата Сообщение от _Ivana Посмотреть сообщение
Сделаю ка я себе уже TODO файлик.
Это хорошо. Но всё же лучше работать, например, с github и вместо файлика вести там Issues, наподобие https://github.com/Ivana-/Liscript/issues/1.

Добавлено через 1 минуту
_Ivana, там же есть и Wiki. Можно оформлять документацию. Если осилить, это очень удобно
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 02:25  [ТС]
Прикольно! А я все по-старинке, записочками на коленке, с вычеркиванием когда сделано... Собственно, сегодня выложил приложение потому что все мои критические TODO были сделаны. Допишу расширения вторым пунктом.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:29
Да, буду завтра разбираться в свободное время Попробую собрать консольный repl под *nix.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 02:33  [ТС]
Хорошо, только давайте как-нибудь если что менять - то согласованно, чтобы не разошлись версии. Тот же гитхаб удобен имхо для этого, только у меня нет опыта пулл-реквестов, но самое время начать его получать Я создам проект там. А то получится что вы допилите классы для интеграции с вашим интерфейсом, а я допилю другое - и потом не склеим.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
21.01.2016, 02:35
Цитата Сообщение от _Ivana Посмотреть сообщение
Хорошо, только давайте как-нибудь если что менять - то согласованно, чтобы не разошлись версии. Тот же гитхаб удобен имхо для этого, только у меня нет опыта пулл-реквестов, но самое время начать его получать Я создам проект там. А то получится что вы допилите классы для интеграции с вашим интерфейсом, а я допилю другое - и потом не склеим.
Совершенно верно. Инициируйте проект. Я подключись, как разберусь что там у вас есть
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
21.01.2016, 05:31  [ТС]
nullxdth, создал проект https://github.com/Ivana-/Liscript-GUI-Java-Swing , но пока не скачивайте - у меня не получилось угадать кодировку файлов, чтобы не кривилась кириллица на гитхабе. Как победю этот момент - перепушу в все файлы в новой кодировке (если вообще удастся найти хорошую кодировку, которая нормально показывает кириллицу везде). На моем компе кодировка windows-1251, кириллица отражается нормально и в IDEA и при работе скомпилированного артефакта.

Добавлено через 18 минут
UPD перепушил на гитхаб все файлы в кодировке UTF-8, там все показывается нормально, можно скачивать. Но у меня на винде при запуске файлов с такой кодировкой кириллица кривится - что делать непонятно, придется наверное постоянно перекодировать туда-сюда кучу файлов по одному.
0
 Аватар для Vaderkos
84 / 83 / 8
Регистрация: 31.03.2015
Сообщений: 447
21.01.2016, 10:59
_Ivana, А можно присоединится или хотя бы понаблюдать за развитием проэкта? Я конечно только учусь, но если в Джаве пишите, то и помочь смогу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2016, 10:59

Clojure Реализация ф-ций CONS, CAR, CDR (Sheme,CLisp)
В книге SICP описан алгоритм реализации функций CONS,CAR,CDR на языке Sheme define (cons x y) (define (dispatch m) (cond ((= m 0)...

Реализация интерфейса
Добрый день. Выполняю пример по видео. В видео чувак нажимает на реализовать интерфейс и у него появляется запись подобного плана: ...

Реализация интерфейса
Написал пример из книги O'Reilly Learning C# 3.0 Chapter 18 создание File-Copier. Все сделал &quot;по инструкции&quot; и несколько раз...

Реализация интерфейса
Сейчас занимаюсь одним проектом. Возникла нужда сделать сайт, с помощью которого можно управлять домом. Нужно в простой браузер, желательно...

Реализация интерфейса
Здравствуйте! Имеется один интерфейс и 2 класса наследника. using System; using System.Collections.Generic; using System.Linq; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru