Оберон-клуб «ВЄДА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"
  1.  
  2. v <- f(); (* новая переменная 'v' такого же типа, как результат f() *)
  3.  

https://github.com/vladfolts/oberonjs/w ... -Variables

2. Автоматическое приведение типа после проверки (аналог WITH), работает только с переменными по месту из пункта 1.
Код: "OBERON"
  1.  
  2. IF pb IS PDerived THEN
  3. pb.derivedField := 123;
  4. END;
  5.  


https://github.com/vladfolts/oberonjs/w ... -Narrowing

Пощупать можно онлайн здесь: http://oberspace.dyndns.org/oberonjs.html

Критика, предложения - приветствуются.

Автор:  Zorko [ 26 июн 2014, 21:10 ]
Заголовок сообщения:  Re: Переменные "по месту" и автоматическое приведение типа

Велкам на форум :)

Не могу сказать, что ощущаю необходимость в таких расширениях. У VAR свои достоинства. Когда видно список переменных — это удобно и дисциплинирует. А всякие доопределения "по месту" и сложные области видимости — только путают. Наверное нужду в таких расширениях может чувствовать сишник, которому надо очень быстро писать гору кода с кучей переменных, добавлять и убирать переменные, и всё это быстро-быстро, а то время деньги. Но это же имеет мало общего с качественным кодингом.

Мне даже на zx.pk.ru такой перл показывали:
Код: "OBERON"
  1. {
  2. // фрейм 1
  3. }
  4. {
  5. // фрейм 2
  6. }
Вот, говорят, смотри как можно. В каждом фрейме своя область видимости, жутко удобно. А я отвечаю: в Паскале/Обероне такие "фреймы" достигаются вложенными процедурами, которых нет в Си-подобных языках. Так и достигается сложная вложенность видимости: у каждой процедуры и свои локальные переменные, и глобальные — общие для процедуры-родителя. Но на Обероне достигается понимание, — зачем именно делается такая декомпозиция. Здесь "фреймы" не анонимны — больше мета-информации, больше оснований именно для такой декомпозиции. А что в сишных "фреймах"? Здесь даже if с блоком then и блоком else порождает две лишние области видимости, даже три — две внутренних и одну внешнюю, — а для этого нужны ведь причины. Если они есть, то пожалуйста. Только, будь любезен, назови "фреймы" именами. Лучше будет программа читаться.

В Оберон-процедуре дополнительная область видимости может быть вызвана необходимостью, но она не порождается в качестве побочного эффекта от IF или WHILE. Это важно. Считаю: это достоинство, а не недостаток.

Ещё Оберон поощряет именно маленькие процедуры. Для них большие и сложные иерархические списки переменных не нужны. А если даже и нужны, то есть переменные модуля, переменные внешней процедуры-родителя и переменные внутренние-локальные. Так что Оберон приветствует вариант "побольше маленьких процедур и небольших списков переменных". И здесь слово VAR никак не мешает, являясь по сути тегом-описателем. Меня всегда путает когда описание начинается с типа. Как-то наоборот всё. :?

Автор:  vlad [ 26 июн 2014, 21:56 ]
Заголовок сообщения:  Re: Переменные "по месту" и автоматическое приведение типа

Zorko писал(а):
А всякие доопределения "по месту" и сложные области видимости — только путают.


Как именно путают? Что можно напутать и при этом не получить ошибку от компилятора? А вот обероновская область видимости на всю процедуру (включая вложенные) - да, есть где наступить на грабли.

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


"Сишник" здесь вообще никаким боком - в любом современном популярном языке локальные переменные не являются чем-то таким важным, что надо описывать в отдельной секции (и в отрыве от контекста использования). Мало того, С (без плюсов) как раз наиболее консервативен - там можно описывать переменные только в начале блока. А вот полный аналог паскальной VAR - среди современных языков надо поискать. Хотя да, на заре начиналось все с секций, но было отброшено эволюцией - компиляторы стали умнее, компьютеры быстрее, а ценности для программиста отдельная секция не несет. Локальные переменные - это расходный материал.

Zorko писал(а):
Мне даже на zx.pk.ru такой перл показывали:
Код: "OBERON"
  1. {
  2. // фрейм 1
  3. }
  4. {
  5. // фрейм 2
  6. }



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

Zorko писал(а):
в Паскале/Обероне такие "фреймы" достигаются вложенными процедурами, которых нет в Си-подобных языках.


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

Zorko писал(а):
Если они есть, то пожалуйста. Только, будь любезен, назови "фреймы" именами. Лучше будет программа читаться.


От того, что я на каждый чих (ровно 2 строки кода) в IF/ELSE заведу по отельной процедуре (локальной) - читаться лучше не будет.
Код: "OBERON"
  1.  
  2. IF x THEN
  3. r <- x.f();
  4. y := f1(r) + f2(r);
  5. END
  6.  


Распиши вот это через локальную процедуру и посмотрим на читабельность.

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/