Оберон-клуб «ВЄДАsoft» https://zx.oberon.org/forum/ |
|
Переменные "по месту" и автоматическое приведение типа https://zx.oberon.org/forum/viewtopic.php?f=86&t=207 |
Страница 1 из 4 |
Автор: | vlad [ 26 июн 2014, 19:21 ] |
Заголовок сообщения: | Переменные "по месту" и автоматическое приведение типа |
Дублирую отсюда специально для Зорко, который не читает альтернативный форум ![]() Добавил сразу два расширения в oberonjs (одно зависит от другого): 1. Переменные "по месту" (избавляемся от VAR). Переменные можно объявлять (и одновременно инициализировать) везде в коде процедуры. Тип переменной выводится из выражения инициализации: Код: "OBERON"
https://github.com/vladfolts/oberonjs/w ... -Variables 2. Автоматическое приведение типа после проверки (аналог WITH), работает только с переменными по месту из пункта 1. Код: "OBERON"
https://github.com/vladfolts/oberonjs/w ... -Narrowing Пощупать можно онлайн здесь: http://oberspace.dyndns.org/oberonjs.html Критика, предложения - приветствуются. |
Автор: | Zorko [ 26 июн 2014, 21:10 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Велкам на форум ![]() Не могу сказать, что ощущаю необходимость в таких расширениях. У VAR свои достоинства. Когда видно список переменных — это удобно и дисциплинирует. А всякие доопределения "по месту" и сложные области видимости — только путают. Наверное нужду в таких расширениях может чувствовать сишник, которому надо очень быстро писать гору кода с кучей переменных, добавлять и убирать переменные, и всё это быстро-быстро, а то время деньги. Но это же имеет мало общего с качественным кодингом. Мне даже на zx.pk.ru такой перл показывали: Код: "OBERON"
В Оберон-процедуре дополнительная область видимости может быть вызвана необходимостью, но она не порождается в качестве побочного эффекта от IF или WHILE. Это важно. Считаю: это достоинство, а не недостаток. Ещё Оберон поощряет именно маленькие процедуры. Для них большие и сложные иерархические списки переменных не нужны. А если даже и нужны, то есть переменные модуля, переменные внешней процедуры-родителя и переменные внутренние-локальные. Так что Оберон приветствует вариант "побольше маленьких процедур и небольших списков переменных". И здесь слово VAR никак не мешает, являясь по сути тегом-описателем. Меня всегда путает когда описание начинается с типа. Как-то наоборот всё. ![]() |
Автор: | vlad [ 26 июн 2014, 21:56 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Zorko писал(а): А всякие доопределения "по месту" и сложные области видимости — только путают. Как именно путают? Что можно напутать и при этом не получить ошибку от компилятора? А вот обероновская область видимости на всю процедуру (включая вложенные) - да, есть где наступить на грабли. Zorko писал(а): Наверное нужду в таких расширениях может чувствовать сишник, которому надо очень быстро писать гору кода с кучей переменных, добавлять и убирать переменные, и всё это быстро-быстро, а то время деньги. Но это же имеет мало общего с качественным кодингом. "Сишник" здесь вообще никаким боком - в любом современном популярном языке локальные переменные не являются чем-то таким важным, что надо описывать в отдельной секции (и в отрыве от контекста использования). Мало того, С (без плюсов) как раз наиболее консервативен - там можно описывать переменные только в начале блока. А вот полный аналог паскальной VAR - среди современных языков надо поискать. Хотя да, на заре начиналось все с секций, но было отброшено эволюцией - компиляторы стали умнее, компьютеры быстрее, а ценности для программиста отдельная секция не несет. Локальные переменные - это расходный материал. Zorko писал(а): Такая штука обычно используется не для сужения видимости, а для вызова деструкторов локальных объектов в нужный момент. Zorko писал(а): в Паскале/Обероне такие "фреймы" достигаются вложенными процедурами, которых нет в Си-подобных языках. Отклоняемся от темы, но вложенные процедуры в обероне абсолютно неюзабельны - потому как все равно не могут быть использованы в качестве замыканий. А возможность изменения внешней по отношению к вложенной процедуре переменной - я вообще рассматриваю как недостаток. Zorko писал(а): Если они есть, то пожалуйста. Только, будь любезен, назови "фреймы" именами. Лучше будет программа читаться. От того, что я на каждый чих (ровно 2 строки кода) в IF/ELSE заведу по отельной процедуре (локальной) - читаться лучше не будет. Код: "OBERON"
Распиши вот это через локальную процедуру и посмотрим на читабельность. Zorko писал(а): Ещё Оберон поощряет именно маленькие процедуры. Ох, неправда ваша. Достаточно посмотреть код Мэтра. Поэтому, в частности, Вирт так любит дублировать название процедуры в конце - очень помогает для процедур, не помещающихся на экран, и абсолютно бесполезная (только больше писать) особенность для маленьких процедур. Кстати, в коде Мэтра можно увидеть и "предельный случай", он же "полный привет", когда переменная 'i' описывается как глобальная переменная модуля, только для того, чтобы быть использованной в цикле FOR в секции инициализации модуля. P.S. Я так понимаю ко второй фиче (приведение типа) претензий нет? ![]() |
Автор: | Zorko [ 26 июн 2014, 22:16 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Да вообще нет претензий, делайте как хотите. Я просто мнение высказал. |
Автор: | vlad [ 26 июн 2014, 22:28 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Zorko писал(а): Да вообще нет претензий, делайте как хотите. Я просто мнение высказал. Хорошо ![]() |
Автор: | Zorko [ 26 июн 2014, 22:42 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Конечно сообщайте. ![]() |
Автор: | geniepro [ 30 мар 2018, 06:22 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Zorko писал(а): А я отвечаю: в Паскале/Обероне такие "фреймы" достигаются вложенными процедурами, которых нет в Си-подобных языках. Это уже не так -- в си-подобных языках, таких как с++, с#, java, javascript уже давно есть лямбды -- а это и есть по сути вложенные функции. |
Автор: | Zorko [ 30 мар 2018, 09:07 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Ну-ка скажи кому-нибудь, что вложенные функции в Паскале — это лямбды. Засмеют. ![]() Это не одно и то же — функции с ограниченной областью видимости даже в пределах одного исходника/модуля и функции, (указатели на) которые фактически передаются другим функциям, чтобы те их вызывали. |
Автор: | Сергей Оборотов [ 30 мар 2018, 10:09 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
В Gnu C вложенные функции реализовали. |
Автор: | geniepro [ 30 мар 2018, 11:29 ] |
Заголовок сообщения: | Re: Переменные "по месту" и автоматическое приведение типа |
Zorko писал(а): Ну-ка скажи кому-нибудь, что вложенные функции в Паскале — это лямбды. Засмеют. ![]() Лямбды -- это по сути просто безымянные функции. В стандартном паскале нет безымянных функций, однако в PascalABC.NET лямбды кстати, добавлены. В зависимости от языка лямбды могут объявляться как внутри функций или других лямбд, так и вообще за пределами каких-либо функций. Например, в компиляторе Хаскелла исходный код предварительно компилируется в так называемый Haskell Core, так там любая функция -- это лямбда. Функций в обычном представлении нет, просто есть некие идентификаторы (в хаскелле они называются переменными, хотя их аналоги в паскале называются константами), которым присваиваются лямбды -- так получаются именованные функции... |
Страница 1 из 4 | Часовой пояс: UTC + 2 часа |
Powered by phpBB® Forum Software © phpBB Group https://www.phpbb.com/ |