Форум ДИЦ

Пользовательский и Дилерский форум ДИЦ
Текущее время: Чт авг 16, 2018 12:52 am

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




Начать новую тему Ответить на тему  [ Сообщений: 8 ] 
Автор Сообщение
 Заголовок сообщения: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 2:40 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 436
Откуда: Москва
Раздела по 10ке не нашел, напишу тут.

1. Анонимные функции (замыкания)

1.1. Не хватает возможности вызвать методы без приведения к типу:
Код:
#Dynamic On;
class "";

inclass
  type F1 = func(arg1: Logical): String;

inobject

--------------------------------------------------------------------------------
--{ Обработчики событий бланка

  func OnGetField(Name :String): F1;
    Result =
      func(arg1: Logical): String
        return if(arg1: "123", "321");
      end;
  end;

  proc Button1OnClick(Sender :Button);
    Trace( (Self.test as F1)(True) ); -- работает :)
    Trace( Self.test(True) ); -- не работает :(, а хотелось бы
  end;

1.2. Было бы здорово иметь какой-то способ присваивать существующие методы в замыкание?
Код:
  proc Method;
  end;

  proc Button2OnClick(Sender :Button);
    var prc: proc;
    --prc = Method; -- не хочет
    --prc = proc Method; -- не хочет

    prc = proc Method; end; -- выход из положения (но с лишним вызовом)

  end;

2. Динамические классы (OnGetField и т.д.)
Очень здорово, что они появились, но этого мало! :)
События OnGetField и ему подобные срабатывают только на отсутствующие в классе/объекте свойства. А очень нужно еще чтобы был способ перехватить присваиваине и получение значений существующих свойств, это позволит сделать очень полезные вещи, например динамическую конверсию типов, когда мы присваем несовместимый тип из типа variant в некое свойство и можем в "полете" сделать конверсию типа.

3. Многострочные литералы
Были реализованы многострочные литералы для строк, но данная возможность востребована также и в описаниях, например:
Код:
  reference СЧ from РПО_БЮДЖ_КЛАСС, filter "NAME_VOC='СЧ' and ((Match(CODE,'201.??') and not Match(CODE,'201.?0') and not CODE='201.35') or (Match(CODE,'206.??') and not Match(CODE,'206.?0')) or (Match(CODE,'208.??') and not Match(CODE,'208.?0')) or (Match(CODE,'302.??') and not Match(CODE,'302.?0')) or (Match(CODE,'303.??')) or (Match(CODE,'304.??')))",
  title "Лицевые счета";
    field Имя synonym Код: String, from CODE;
    field Описание synonym Наименование: String, notrefresh, from TXT;
  end;

Видите сумасшедший фильтр? Как бы сделать чтобы он также разбивался на строки?

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 2:55 pm 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1676
1 Первый пример я не понял, там ошибка, но если предположить что "test" это функция, возвращающая замыкание, то можно писать:

Код:
Trace( (Test)(True) );

В Новеньком я приводил пример вызова замыкания на выражении. Например, для вычисления факториала:

Код:
Trace(
  (func(N :Integer) :Numeric
     var i :Integer;
     Result = 1;
     for i = 1..N do
       Result = Result * i;
     end;
   end)(33)
);


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 2:57 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 436
Откуда: Москва
rusov писал(а):
1 Первый пример я не понял, там ошибка, но если предположить что "test" это функция, возвращающая замыкание, то можно писать:

Там нет ошибки, это динамический класс! Код рабочий.

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 2:58 pm 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1676
Losev писал(а):
1.2. Было бы здорово иметь какой-то способ присваивать существующие методы в замыкание?

В Build 10030 добавлены "Короткие замыкания"
Код:
- ТБ.Скрипт: "Короткие" замыкания - простой способ превратить обычные процедуры
  или функции в замыкания. Если в выражении написать: @ИмяПроцедуры то это
  будет эквивалентно созданию замыкания с таким же прототипом как у этой
  процедурЫ, перевызывающего ее с передачей всех параметров.
 
  Например, если у вас есть процедура:

  proc Some(Sender :IControl);
  end;


  А по синтаксису требуется замыкание, то вместо:

  Button1.OnClick = proc(Sender :IControl) Some(Sender); end;

  теперь можно писать:

  Button1.OnClick = @Some;


  Пример использования коротких замыканий для вычислимых свойств:

  private
    var FInternalField :String;

    func GetMyField :String;
      Result = FInternalField;
    end;

    proc SetMyField(aNewValue :String);
      FInternalField = NewValue;
      -- Пересчёт...
    end;

  public
    var FaceField :String get @GetMyField set @SetMyField;


  Если Getter не нужен, можно упростить:

    var FaceField :String get @FInternalField set @SetMyField;

  Или

    var FaceField :String = FInternalField set @SetMyField;


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 3:03 pm 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1676
3 - Не понял вопроса. Очевидно:

Код:
reference СЧ from РПО_БЮДЖ_КЛАСС,
  filter
    `NAME_VOC='СЧ'
    and ((Match(CODE,'201.??') and not Match(CODE,'201.?0') and not CODE='201.35')
      or (Match(CODE,'206.??') and not Match(CODE,'206.?0'))
      or (Match(CODE,'208.??') and not Match(CODE,'208.?0'))
      or (Match(CODE,'302.??') and not Match(CODE,'302.?0'))
      or (Match(CODE,'303.??'))
      or (Match(CODE,'304.??')))`,
  title "Лицевые счета";

  field Имя synonym Код: String, from CODE;
  field Описание synonym Наименование: String, notrefresh, from TXT;
end;


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 3:10 pm 
Не в сети

Зарегистрирован: Сб май 14, 2005 5:12 pm
Сообщения: 1676
Losev писал(а):
Там нет ошибки, это динамический класс! Код рабочий.

А, я сразу не разобрался. Теперь можно так запутать код - что никто не разберется :)
Нет, вызвать замыкание на Variant без приведения типа нельзя. Вряд ли это изменится.


Вернуться к началу
 Профиль Отправить личное сообщение  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 3:29 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 436
Откуда: Москва
Опа, новые литералы работают и в описании... круто, а переносы строк не помешают фильтру?

_________________
ТБ.Бюджет


Вернуться к началу
 Профиль Отправить личное сообщение Отправить email  
 
 Заголовок сообщения: Re: Feedback по новым возможностям
СообщениеДобавлено: Пт июл 20, 2018 3:39 pm 
Не в сети

Зарегистрирован: Пт июн 29, 2012 12:18 am
Сообщения: 436
Откуда: Москва
И свойства еще появились? Просто кайф!

_________________
ТБ.Бюджет


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

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


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

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


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

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