Оберон-клуб «ВЄДАsoft»

Твердыня модульных языков
Текущее время: 29 мар 2024, 00:02

Часовой пояс: UTC + 2 часа




Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2, 3  След.
Автор Сообщение
СообщениеДобавлено: 27 сен 2018, 23:48 
Не в сети

Сообщения: 350
Записал видео с рассуждениями о том, как должна выглядеть консоль и как её сделать.

https://youtu.be/Pl9hUrtg0Gc

К сожалению, в изготовлении консоли есть одно место, которое я не придумал, как реализовать - печать возвращаемого значения. Хотя нет, наверное, придумал.

Есть ANYPTR и конечное число N примитивных типов, включая VOID.
Значит, мы не более чем N+1 раз пытаемся создать модуль
Код: "OBERON"
  1.  
  2. MODULE Command_И;
  3. IMPORT ... Что положено
  4. PROC Run : Тип_И
  5. RETURN <Введённое пользователем выражение>
  6. END END
  7.  

Когда мы сумели скомпилировать такой модуль, мы верно угадали тип выражения. И дальше печатаем, как можем. Для ANYPTR печатаем TYPEOF.

Так мы получаем полностью основанный на компиляции "интерпретатор", которому нужно лишь умение компилировать модули и выполнять команды без параметров.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 10:09 
Не в сети

Сообщения: 350
Изучаю уровень техники.

https://oberoncore.ru/library/temir_int ... _ble_kboks
https://www.youtube.com/watch?v=FePpMie31fc 11.59


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 16:06 
Не в сети
Аватара пользователя

Сообщения: 67
Откуда: Equestria
Генерировать модули и потом их компилировать - это адовый костыль, чтобы побыстрей.
Лучше, а может даже и проще, написать человеческий интерпретатор с нормальным языком для интерактвного ввода. Это не так уж и сложно (да хотя бы тот же лишп).

Очень большой секрет, только никому не говори, СПОЙЛЕР: дважды кликнув ПКМ на слове - оно выделяется!


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 18:33 
Не в сети

Сообщения: 350
Понял, что во-первых, нужно менять модуль мета, чтобы добавить к нему константы. Меня не интересует экономия памяти в таких объемах, которые на этом можно получить. Педагогического смысла в этом тоже немного. А кто хочет экономить память до предела, тот может вообще выкинуть этот модуль из сборки.

Во-вторых, сам факт наличия модуля мета очень полезен и, возможно, позволит решить вопрос с печатью.

В-третьих, я так и не посмотрел видео от начала и до конца (всё время дёргали меня), но я понял, что вопрос о семантике достоин долгих ночных ворочаний и утренних озарений. Я вспомнил, что у Firebird есть аж три близких диалекта (для консоли, для триггеров и для встроенного SQL), и что в Яре я хотел различать «скрипты» и «модули». И что мои недавние раздумия про tcl приводят к мысли о том, что язык для процедур и язык для командной строки - это, скорее всего, должны быть два разных языка. По той простой причине, что код в модуле один раз пишется и много раз читается. А код в консоли зачастую пишется один раз и читается не более одного раза. Т.е. цель другая и оптимальное решение другое.

Евгений осмелился сделать для интерпретатора семантику, отличную от семантики компонентного Паскаля - этот факт требует большого осмысления.

SovietPony писал(а):
Генерировать модули и потом их компилировать - это адовый костыль, чтобы побыстрей.
Лучше, а может даже и проще, написать человеческий интерпретатор с нормальным языком для интерактвного ввода. Это не так уж и сложно (да хотя бы тот же лишп).

Это решение лишено интегральности. Лисп не так прост, как видится издалека. Большинство промышленных лиспов содержат компилятор в машинный код. Я могу в командной строке определить функцию и эта функция будет точно такой же по всем своим свойствам, как функция в скомпилированном модуле. Допустим, мы идём по пути который вы предлагаете и пишем в консоли:
Цитата:
PROCEDURE Ъ : INTEGER;
RETURN 2;
END Ъ

Это будет интерпретируемая процедура (мы же написали интерпретатор, а не компилятор). Она не будет интегрирована (указатель на неё мы с трудом сможем или вообще не сможем записать в поле, ожидающее указатель на процедуру с такой же сигнатурой). Итог: мы потратили больше труда, и повторили в плохом качестве то, что в BlackBoxComponentBuilder уже есть в хорошем, притом оказались оторваны от среды. Поэтому подход с генерацией модулей - не костыль, а единственно правильный подход, если мы хотим семантику REPL приближенную к семантике КП. Другое дело, можно поменять компилятор так, чтобы ему не нужно было выписывать все эти слова MODULE и т.п.

В-четвёртых, похоже, что Евгений проделал массу необходимой работы. Может быть, его интерпретатор может быть пригоден и можно сосредоточиться на собственно реализации консоли.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 19:57 
Не в сети

Сообщения: 350
> дважды кликнув ПКМ на слове - оно выделяется!
Я знаю, но это несущественное утешение. Т.к. всё равно нужно убрать руку с клавиатуры и перенести на мышь, а затем навести курсор мыши туда, где с большой вероятностью уже находится курсор клавиатуры. И Модуль.Имя двойным щелчком не выделяется.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 22:13 
Не в сети

Сообщения: 350
В принципе, была бы уже эрзац-консоль, если бы некая горячая клавиша (допустим, Ctrl-m или Ctrl-j) вставляла бы значёк завершения коммандера и сразу выполняла последний коммандер (в интерпретаторе Евгения). Это не консоль конечно, и лишних нажатий всё ещё многовато, зато оберон-вей и можно оставить этот вопрос и идти дальше. При этом возможность воткнуть команду в любом месте тоже имеет определённые плюсы - это как «рабочие книги» в Mathematica.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 22:50 
Не в сети

Сообщения: 350
entierfn - это ключевое слово для изучения процесса создания встроенных функций. Очевидно, для вывода результата вычисления на консоль нужна полиморфная функция PRINT или TOSTRING, способная обрабатывать любой тип данных, который может вернуться из процедуры. Для записей можно как-то пытаться выкрутиться через Kernel.TypeOf, а для встроенных типов нужно что-то колдовать.

Если есть оберон-вей сделать такую функцию TOSTRING, то ваши комментарии приветствуются. Рассуждения о ненужности такой функции НЕ приветствуются. Я пришёл из лиспа, где такая функция есть, она полезна и давайте не будем это обсуждать :) Кроме того, она по сути есть и в BlackBoxComponentBuilder - в отладчике. Пусть даже не совсем она, но хотя бы get-inspector-values Отладчик «не нужен», но trap-то нужен :) . Trap показывает стек и там тоже есть инспектор объектов. Так что функция, позволяющая человеку увидеть содержимое любого объекта в осмысленном виде, в том или ином виде де-факто признана нужной и в ББЦБ.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 23:23 
Не в сети
Аватара пользователя

Сообщения: 67
Откуда: Equestria
budden писал(а):
если мы хотим семантику REPL приближенную к семантике КП
Ясно. У нас разные цели. Я не заинтересован.
(Спрашивать зачем оно такое надо и продолжать спор я не буду)

budden писал(а):
где с большой вероятностью уже находится курсор клавиатуры
Там где уже стоит каретка, можно нажать ctrl+shit+стрелка, а нужную операцию повесить на хоткей.
Хмм... а ведь так можно избавиться от необходимости мыши в ББ. Только надо сделать тайлинг окон с воркспейсами или хотя бы табы (где-то были какие-то патчи).

budden писал(а):
И Модуль.Имя двойным щелчком не выделяется.
Это и не требуется. Точка-Имя все равно подхватятся.


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 23:27 
Не в сети

Сообщения: 350
И ещё про семантику. Я читаю доклад Евгения и сразу бросается в глаза, что количество отличий по семантике от КП довольно велико. Евгений говорит, что вот он должен два дня разбираться вlокументации Bash, чтобы написать страницу текста. Но на самом деле другой пользователь и в интерпретаторе Евгения будет долго разбираться.

Отсюда возникает мысль сделать REPL для начала предельно прозрачный, категорически мало отличающийся от КП. Попробую сформулировать набор правил:

i-ю команду, введённую в REPL, обозначим как Команда_i.

Выполнение команды Команда_i происходит так:
1. Создаётся исходный текст модуля Repl_i, он импортирует Repl_1 ... Repl_<i-1>, а также все модули, которые известны системе. При этом все импортируемые Repl_1 ... Repl_<i-1> типы, переменные, константы, процедуры попадают (с помощью модуля-обёртки? изменением компилятора?) в единое пространство имён.
2. Если Команда_i определяет тип, процедуру, переменную, то этот модуль останется загруженным после завершения команды. Если же она выполняет выражение или присваивает выражение переменной, то модуль сразу же выгружается.

Вот, собственно говоря, и всё. Дальнейшим применением принципов построения КП станет команда «забыть всю историю после эн», что приводит к выгрузке всех модулей Repl_и с номерами больше эн и, соответственно, забвению всех определений и потере значений всех переменных, созданных после эн. А вот я кстати не знаю, что будет, если мы записали экземпляр потомка в переменную типа указатель на предка, а потом пытаемся выгрузить модуль, где определён тип потомка. По идее это должен быть «бэмс», или нужно вести учёт того, есть ли инстансы каждой записи, а это очень дорого, или нужно хранить дескрипторы типов посредством сборщика мусора - тогда мы не имеем возможности узнать все типы, присутствующие в системе. Вообще, без точного сборщика мусора и возможности перебрать все объекты, многие вещи становятся недоступными.

Так мы почти автоматически получаем консоль с долгоживущими переменными, процедурами, определениями типов и даже с переопределением (через забвение).
Можно было бы добавить "анонимное тело процедуры", но достаточно добавить анонимный модуль - накладные расходы минимальны. "Скрипт" с локальными переменными будет выглядеть так:
Код: "OBERON"
  1.  
  2. MODULE ANONYMOUS
  3. ;; неявно импортируется контекст REPL.
  4. определения
  5. BEGIN
  6. код для выполнения
  7. END
  8.  


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 28 сен 2018, 23:28 
Не в сети
Аватара пользователя

Сообщения: 67
Откуда: Equestria
budden писал(а):
Если есть оберон-вей сделать такую функцию TOSTRING

Сам же и ответил на свой вопрос - смотреть исходники DevDebug.


Вернуться к началу
 Профиль  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 23 ]  На страницу 1, 2, 3  След.

Часовой пояс: UTC + 2 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
© VEDAsoft Oberon Club