thumbnail of 0514702bec8c76d4e1d732edd7a2f658.png
thumbnail of 0514702bec8c76d4e1d732edd7a2f658.png
0514702bec8c76d4e1d73... png
(613.72 KB, 604x604)
 >>/2649/
> Иногда нужно прописать классы, их методы и просто функции, чтобы определиться с архитектурой. И вот только тогда будет возможно определить, если решение неправильное и вовремя исправить свою ошибку.
> И в случае с разработкой ЯП, письмо кода на нём, до его выпуска, позволяет хорошо отшлифовать стандарт, чтобы было удобно.
Всё это логично и, наверное, помогает разрабатывать язык, но ты же его ещё не разработал. Его нет, зато есть громкие заявления о сложных фичах, которые ты уже оттестировал путём написания незапускаемого кода.

> А то выпустил бы я laisi с процедурно генерируемыми типами, во время исполнения и это было бы очень сложно реализовать.
Написание кода для несуществующего компилятора помогает тебе понять, что та или иная фича будет сложна в реализации?

> Нет, такое не использую.
Да хосспади, это же так принципиально.

> Что насчёт стека, то вроде бы как, представляю как он работает.
И с этими знаниями ты берёшься разрабатывать язык?

Допустим, обычный вызов и возврат ты понимаешь. Но:
> Как работают исключения и генераторы в других компилируемых языках программирования я не имею понятия.

> Но я планировал, что будет в функцию будет пересылаться указатель на структуру исключения, которая состоит из структуры которую функция бросает и немного памяти для результат выхода из функции, при raise она будет в эту структуру записывать данные и возвращаеться. В зависимости от результата (return, raise или yield) в ту структуру пересылается номер типа выхода. И дальше в зависимости от этого результата зависит поведение программы. Если исключение, то это исключение пересылается в исключение верхнего уровня, если это не в try {} и так далее, пока не выйдет из программы. В случае если это простая исполняемая программа с _start, то функция _start содержит обработчик исключения, который выведет сообщение об ошибке, либо просто возвратит ненулевой результат.
> Хотя я ещё планировал ввести такой модификатор кода, который позволит в структуру исключения заносить названия функций, номера строк и столбцов в коде. Для дебаггинга.
Как я всё это понял: функция может вернуть либо значение через return, либо исключение через raise. Вызывающая функция должна проверять, что было возвращено. И если это оказалось исключение, то она сама делает raise дальше, ну или обрабатывает исключение сама, если в ней есть try. Верно?

Звучит правдоподобно, хоть и неэффективно. Работать будет, в принципе.

> Как я планировал генераторы сделать, я уже писал выше. Либо все локальные переменные пересылаются в аргументы
И возвращаются назад, когда делается yield?

> либо, если платформа поддерживает потоки, то внутри потока будет и мьютексом останавливаться когда надо, а yieldить в опредлённый адрес
Какой же это пиздец костыль, ты же несерьёзно?

> Если платформа однопоточная и не поддерживает потоки (микроконтроллеры, например)
Ты ещё и о поддержке микроконтроллеров фантазируешь?

> а генератор не рекурсивный, то переменные вообще можно хранить в глобальной памяти
Рекурсивных генераторов не существует. Может быть несколько инстансов одного генератора одновременно, например, в Питоне:

a = range(10)
b = range(10)
c = range(10)

Хуяк, и у тебя есть три генератора, созданных из одной функции. И использовать глобальные переменные вместо локальных уже нельзя. Как ты будешь это проблему решать?

 >>/2653/
> Чтобы убедиться в правильности результата, придётся править код файла icolaisi, раскомментировать принтинг retval.
То есть на данный момент по-прежнему ничего не работает?