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

Твердыня модульных языков
Текущее время: 06 окт 2024, 00:42

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




Начать новую тему Ответить на тему  [ Сообщений: 34 ]  На страницу 1, 2, 3, 4  След.
Автор Сообщение
СообщениеДобавлено: 26 июн 2014, 19:21 
Не в сети

Сообщения: 108
Дублирую отсюда специально для Зорко, который не читает альтернативный форум :)

Добавил сразу два расширения в 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

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 21:10 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Велкам на форум :)

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

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

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

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


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 21:56 
Не в сети

Сообщения: 108
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. Я так понимаю ко второй фиче (приведение типа) претензий нет? :) А ведь она намного более необычна (аналог есть в котлине) на фоне популярных ЯП.


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Да вообще нет претензий, делайте как хотите. Я просто мнение высказал.


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

Сообщения: 108
Zorko писал(а):
Да вообще нет претензий, делайте как хотите. Я просто мнение высказал.


Хорошо :) Про будущие расширения сюда чего-нибудь сообщать - интересно/неинтересно?


Вернуться к началу
 Профиль  
Ответить с цитатой  
СообщениеДобавлено: 26 июн 2014, 22:42 
Не в сети
Аватара пользователя

Сообщения: 1019
Откуда: Днепропетровская обл.
Конечно сообщайте. :) Дополнительная информация на тематическом ресурсе только повышает шансы продукта. Так что в этом вижу только плюсы.


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

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

Это уже не так -- в си-подобных языках, таких как с++, с#, java, javascript уже давно есть лямбды -- а это и есть по сути вложенные функции.


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

Сообщения: 1019
Откуда: Днепропетровская обл.
Ну-ка скажи кому-нибудь, что вложенные функции в Паскале — это лямбды. Засмеют. :-)

Это не одно и то же — функции с ограниченной областью видимости даже в пределах одного исходника/модуля и функции, (указатели на) которые фактически передаются другим функциям, чтобы те их вызывали.


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

Сообщения: 11
В Gnu C вложенные функции реализовали.


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

Сообщения: 203
Zorko писал(а):
Ну-ка скажи кому-нибудь, что вложенные функции в Паскале — это лямбды. Засмеют. :-)

Лямбды -- это по сути просто безымянные функции. В стандартном паскале нет безымянных функций, однако в PascalABC.NET лямбды кстати, добавлены.
В зависимости от языка лямбды могут объявляться как внутри функций или других лямбд, так и вообще за пределами каких-либо функций.
Например, в компиляторе Хаскелла исходный код предварительно компилируется в так называемый Haskell Core, так там любая функция -- это лямбда. Функций в обычном представлении нет, просто есть некие идентификаторы (в хаскелле они называются переменными, хотя их аналоги в паскале называются константами), которым присваиваются лямбды -- так получаются именованные функции...


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

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


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

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


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

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