Форум ДИЦ

Пользовательский и Дилерский форум ДИЦ
Текущее время: Сб фев 16, 2019 11:28 am

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Feedback по новым возможностям (2)
СообщениеДобавлено: Пн фев 04, 2019 5:27 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 447
Откуда: Москва
1. Очень понравилась новая возможность описания переменых в любом месте кода и выведение их типов. На данный момент, правда, не поддержан вывод типов замыканий, а хотелось бы т.к. позволит существенно сократить и упростить код и вместо
Код:
    var printName: proc (x: String; i: Integer) =
      proc (x: String; i: Integer)
        Trace(Str(i) + ". " + x);
      end;
Можно было бы записать:
Код:
    var printName =
      proc (x: String; i: Integer)
        Trace(Str(i) + ". " + x);
      end;

2. Анонимные функции (замыкания) тоже очень впечатляют. Однако, синтаксис с ними связанный выглядит несколько громоздким и излишним.
2.1. Во-первых, описание типов замыкания избыточно т.к. включает имена аргументов в нем, которые никак не используются:
Код:
  type F1 = proc (x: String; i: Integer);
Было бы логичней если бы это выглядело как
Код:
  type F1 = proc (String; Integer);
Или когда мы описываем тип переменной-замыкания или аргумент переменной-замыкания непосредственно в коде:
Код:
    var printName: proc (x: String; i: Integer) =
      proc (x: String; i: Integer)
        Trace(Str(i) + ". " + x);
      end;
Преобразуется в:
Код:
    var printName: proc (String; Integer) =
      proc (x: String; i: Integer)
        Trace(Str(i) + ". " + x);
      end;

Тоже самое при описании типов аргументов:
Код:
  proc printNames(names: StringList; how: proc(x: String; i: Integer));
    names.each(how);
  end;
Тут также имена аргументов: x, i - замыкания how лишние.

2.2. И наоборот описание функций-литералов выглядит избыточным в тех местах где уже тип замыкания известен. Во многих языках программирования существуют более короткие записи функций-литералов там где тип функции известен. Возьмем опять наш пример:
Код:
    var printName: proc (x: String; i: Integer) =
      proc (x: String; i: Integer)
        Trace(Str(i) + ". " + x);
      end;
В нем посмотрим на функцию-литерал (выражение после =) в кором как раз наоборот не нужны типы, т.к. они уже опеределены. Также нам не нужна директива proc т.к. это тоже следует из типа. Соотвественно, если мы уберем все лишнее останется:
Код:
    var printName: proc (x: String; i: Integer) = (x; i) Trace(Str(i) + ". " + x); end;
Что примерно соответсвует более короткой записи во многих других языках программирования, например я Java литералы выглядят так:
Код:
() -> System.out.println("Hello, world.") // нет параметров
a -> a // один параметр
(a, b) -> a + b // одиночное выражение
(long id, String name) -> "id: " + id + ", name:" + name // с явным заданием типов
(a, b) -> { return a + b; } // блок выражений

Я бы предложил похожий синтаксис литералов для ТБ.Скрипт и наш пример стал бы выглядеть одним из следующих вариантов:
Код:
var printName: proc (x: String; i: Integer) = (x; i) Trace(Str(i) + ". " + x); end; // первый вариант с убиранием всего лишнего
var printName: proc (x: String; i: Integer) = (x; i) -> Trace(Str(i) + ". " + x); end; // Вариант в стиле Java

А убрав и имена аргументов из типа получим:
Код:
var printName: proc (String; Integer) = (x; i) Trace(Str(i) + ". " + x); end; // вариант 1
var printName: proc (String; Integer) = (x; i) -> Trace(Str(i) + ". " + x); end; // вариант 2
Что существенно лаконичней.

2.3. Для дальнейшего сокращения кода, помогло бы введение поддержки не блочных инструкций состоящих только из одной инструкции во всей программе, и тогда можно было бы записать:
Код:
if условие then инструкция; -- простой if без end
for var i =  1..10 do Инструкция; -- простой for
while условие do Инструкция; -- простой while

И наконец наше замыкание из предыдущего пункта выглядело бы одним из следующих способов:
Код:
var printName: proc (String; Integer) = (x; i) Trace(Str(i) + ". " + x); // вариант 1 без end
var printName: proc (String; Integer) = (x; i) -> Trace(Str(i) + ". " + x); // вариант 2 без end

3. Очень хорошая функция Each была добавлены в List и RegExp. В функции Each тип аргумента-замыкания описан как proc:Variant, что очень неудобно, т.к. во-первых, не понятно какого формата должен быть вызов, а во-вторых, раз тип Variant то короткая запись потребует указания типов аргументов при вызове и в, третьих, я пока гадал с форматом вызова, наткнулся на баг, когда при использовании для List.Each функции с одним параметром, описанная внутри замыкания переменная накладывается на второй аргумент (номер в списке).

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Вт фев 05, 2019 12:11 am 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1702
Спасибо за feedback. Мы рассмотрим ваши предложения (хотя не обещаю, что все примем).

Выведение типа замыканий и типизация замыканий во встроенных итераторах, конечно, будут - это просто недоделка.

Что касается сокращения синтаксиса - тут я настроен скептически.

1. Имена формальных аргументов в описании типа замыкания существенно помогают с точки зрения "самодокументируемости" кода.
2. Выведение типа аргументов замыкания возможно не всегда. К тому же, мне кажется, это затруднит "читаемость" кода, т.к. в отличии от выведения типа при присвоении тут совершенно не видно выражения из которого выводится тип, всегда придется переходить на описание расположенное в где то в другом месте.
3. Опускать слово proc - точно нет. Тут лаконичность вредит понятности (IMHO). К тому же я не уверен, что это возможно с точки зрения грамматики.
4. Структурные конструкции без end - тоже вряд-ли. Должны же быть какие-то принципы, в конце концов :)


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Вт фев 05, 2019 12:25 am 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1702
Что касается дальнейшего развития ТБ.Скрипт рассматриваются следующие фичи:

1. Обобщенные типы (aka generics), типа:
List<Object>,
Map<String, Object>

2. Унификация объектного синтаксиса на простые типы (с возможностью их extends):
Str.Length,
Arr.Add(...)

3. FOR-Итераторы:
for Value in Select(...) do
...

4. Многозначные выражения:
func Some :String, Integer;
X, Y = Y, X;

Можете проголосовать :)


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Вт фев 05, 2019 2:09 am 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 447
Откуда: Москва
Большое спасибо, что читаете! Позвольте еще немного поспорить :)

rusov писал(а):
Что касается сокращения синтаксиса - тут я настроен скептически.

1. Имена формальных аргументов в описании типа замыкания существенно помогают с точки зрения "самодокументируемости" кода.
Конечно, но можно было бы сделать опциональным, кто хочет описать, пусть описывает имена аргументов в типах.

rusov писал(а):
2. Выведение типа аргументов замыкания возможно не всегда. К тому же, мне кажется, это затруднит "читаемость" кода, т.к. в отличии от выведения типа при присвоении тут совершенно не видно выражения из которого выводится тип, всегда придется переходить на описание расположенное в где то в другом месте.
Тоже самое, сокращенный синтаксис мог бы быть опциональным и гибким, т.е. можно указать типы аргументов и если вывод типа аргумента не возможен, то копилятор потребует указать, это общая практика в других языках.

rusov писал(а):
3. Опускать слово proc - точно нет. Тут лаконичность вредит понятности (IMHO). К тому же я не уверен, что это возможно с точки зрения грамматики.
По поводу лаконичности не согласен, вариации этого синтаксиса уже закрепились в других языках и уже стало стандартом. Я уже приводил выше пример из Java, также мне очень нравится как сделано в Scala, синтаксис которого в части задания типов совпадает с Delphi и можно делать красивые вещи. Вот пример вывода из командного интерпретатора Scala:
Код:
scala> val list = List(-10,-5,-1,0,1,5,20)             -- создаем список
list: List[Int] = List(-10, -5, -1, 0, 1, 5, 20)

scala> list.filter( (x) => x > 0)      -- фильтруем библиотечной функцией
res0: List[Int] = List(1, 5, 20)

scala> list.filter( x => x > 0)       -- тоже самое но проще
res1: List[Int] = List(1, 5, 20)

scala> list.filter( _ > 0)              -- и еще проще с символом подстановки
res2: List[Int] = List(1, 5, 20)

scala> list.filter( (x: Int) => x > 0)    -- ну и более полный синтаксис с заданием типов тоже возможен
res3: List[Int] = List(1, 5, 20)

Если вам так не нравится отсутсвие proc, то некоторые языки используют слово lambda, в Python например:
Код:
foo = lambda x: x*x  // Python


rusov писал(а):
4. Структурные конструкции без end - тоже вряд-ли. Должны же быть какие-то принципы, в конце концов :)
Ну это уже я не настаиваю. Просто, этот end уж больно длинный в сравнении, например, с операторым блоком {}.

rusov писал(а):
Что касается дальнейшего развития ТБ.Скрипт рассматриваются следующие фичи:

1. Обобщенные типы (aka generics), типа:
List<Object>,
Map<String, Object>

2. Унификация объектного синтаксиса на простые типы (с возможностью их extends):
Str.Length,
Arr.Add(...)

3. FOR-Итераторы:
for Value in Select(...) do
...

4. Многозначные выражения:
func Some :String, Integer;
X, Y = Y, X;
Всеми руками и ногами ЗА :shock:

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Вт фев 05, 2019 11:43 am 
Не в сети

Зарегистрирован: Вт мар 30, 2004 12:30 pm
Сообщения: 5134
Откуда: Москва, Кустарь-одиночка с мотором
О, раз уж тут изменения в языке обсуждаются, то хотелось бы, чтобы в описаниях переменных можно было тип в начале описания указывать
Сейчас так "var x,y :Integer;", а при описании большого количества переменных гораздо удобнее было бы так:
VAR Integer: i,n,x,y,.....;

_________________
Андрей Булетов, Москва
PS Не стесняйтесь, поправьте меня, если я не прав!


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Ср фев 06, 2019 10:48 am 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1702
Buletov писал(а):
Сейчас так "var x,y :Integer;", а при описании большого количества переменных гораздо удобнее было бы так:
VAR Integer: i,n,x,y,.....;

Чем удобнее то?!


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Ср фев 06, 2019 11:48 am 
Не в сети

Зарегистрирован: Пт апр 16, 2004 5:11 pm
Сообщения: 6800
Откуда: OpenFly Soft Technology, Москва
Тем, что один раз написал integer и потом добавляешь туда переменные. А то куча строк с integer.

_________________
www.TurboFlyERP.ru


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Ср фев 06, 2019 12:25 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 447
Откуда: Москва
По поводу объявления переменных, не думаю, что это хорошая идея т.к. общий принцип "имя_переменной:тип" должен сохраняться везде единым. К тому же уже поддержан новый синтаксис объявлений перменных на лету прям с инициализацией и тип может выводиться автоматически:
Код:
var a = 0;
var контрагент = Biz.Data.Entity.DocId(1);

Индексы циклов также теперь описываются на лету:
Код:
for var i=1..10 do
end;

Поэтому больших списков переменных теперь не должно быть в принципе. А если у вас монструозная функция с большим количеством перменных это также свидетельствует что функцию нужно разбить на несколько т.к. это нарушает принцип единой отвественности.

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Ср фев 06, 2019 12:30 pm 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1702
И сейчас можно добавлять много переменнных в один var. Какая разница в конец или в середину?

var i, j, k :Integer;

Это точно меняться не будет.

_Возможно_ , будет параллельное присваивание, типа:

var i, j, k = 0, 0, -1;


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям (2)
СообщениеДобавлено: Ср фев 06, 2019 12:39 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 447
Откуда: Москва
rusov писал(а):
_Возможно_ , будет параллельное присваивание, типа:

var i, j, k = 0, 0, -1;

А вот это поддерживаю.

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


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

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


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

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB