Версия PascalABC.NET 3.1

В последних версиях появились операции, порождающие из обычной последовательности “последовательности последовательностей” или разбивающие её на несколько последовательностей. Возник вопрос: как эффективно “собрать назад” такие конструкции?

// PascalABC.NET 3.1, сборка 1200 от 13.03.2016
begin
  var a:=Range(0,11); // Sequence of integer (по Intellisence)
  Writeln(a); // [0,1,2,3,4,5,6,7,8,9,10,11]
  
  var b:=a.SplitAt(4); // System.Tuple<integer>
  Writeln(b); // ([0,1,2,3],[4,5,6,7,8,9,10,11])
  var b1:=b.Item1+b.Item2; // integer - ОШИБКА Intellisence?
  Writeln(b1); // [0,1,2,3,4,5,6,7,8,9,10,11]
   
  var c:=a.Batch(4); // Sequence of integer
  Writeln(c); // [[0,1,2,3],[4,5,6,7],[8,9,10,11]]
  // как все это собрать "назад" в исходную последовательность?
end.
2 лайка

SelectMany

А нельзя дописать этот самый SelectMany, как он должен выглядеть в предложенной программе?

  c.SelectMany(x->x).Println;

SelectMany превращает иерархическую последовательность в плоскую

1 лайк

Спасибо! С любым уровнем иерархии?

Нет. Только с одним. Думаю, поприменяйте несколько раз :slight_smile:

1 лайк

Так все и задумано?

// PascalABC.NET 3.1, сборка 1200 от 13.03.2016
begin
  Range(10,16).Println;    // 10 11 12 13 14 15 16
  Range(16,10).Println;    // пустая строка
  Range(10,16,1).Println;  // 10 11 12 13 14 15 16
  Range(16,10,1).Println;  // 16 17 18 19 20 21 22 ???
  Range(10,16,-1).Println; // 16 15 14 13 12 11 10
  Range(16,10,-1).Println; // 10 9 8 7 6 5 4       ???
end.
2 лайка

Раньше как-то необходимости не было, а сейчас появились мысли поэкспериментировать с асинхронными методами. И я понял что на паскале это все очень нетривиально. что использовать вместо ключевых слов async и await? Относительно async наверно даже не что, а как, ибо жирным как ключевое подсвечивает… Хотелось бы простенький пример асинхронной процедуры например, которая что-то внутри себя делает, а пока она что-то делает выводить в консоль например состояние, в процентах. Или асинхронность пока вообще не поддерживается?

Исправили. Это конечно явные ошибки. Это самая старая функция на последовательности. Когда она писалась, она не была рассчитана на отрицательный шаг и ход назад.

1 лайк

async и await в планах. В .NET есть множество средств в библиотеке конечно - класс Task и около.

А Вы приведите пример на C# кода, который хотелось бы реализовать

Тернарный оператор в Паскале?

// PascalABC.NET 3.1, сборка 1201 от 18.03.2016
begin
  Range(-5,5).Select(x->x<0 ? 2*x : x*x).Println
end.

// -10 -8 -6 -4 -2 0 1 4 9 16 25

Это секретная фишка Паскаля, про которую все знают, но мало кто ей пользуется

Строго если, это фишка не Паскаля, а лямбды в LINQ. Тут главное, чтобы её в один прекрасный день не зарубил паскалевский парсер, а то привыкнешь пользоваться, - а тебе опа… серпом, как говорится, … ну, неважно)))

Посему хотелось бы послушать “начальника транспортного цеха” (с)

1 лайк

Извините, неправильно выразился. Я не хотел сказать, что это изобретение PascalABC.NET. Всего лишь указать на “секретность” данной возможности в Паскале.

Я Вас понял, за пределами “лаборатории чистого разума” (с) люди называют это недокументированной возможностью".

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

(А.Кобринский. “Открытие профессора Фула”)

Да, надо будет задокументировать. Забываем. Кто ж такое зарубит?

2 лайка

Вот как тут не вспомнить знакомую с детских лет классику - “Мойдодыра” К.Чуковского?

Вот теперь тебя люблю я, Вот теперь тебя хвалю я! :smile:

Ну вообще в планах что-то вроде: http://stackoverflow.com/questions/17972268/async-await-with-a-winforms-progressbar, не такое замороченное как там, без всяких перехватов управления. Вот это даже ближе наверно http://stackoverflow.com/questions/20629494/async-await-with-a-winforms-progressbar-winforms-version.

То есть некий процесс, достаточно долгий (возможно больше минуты, там файлики генерятся) прогресс которого можно было бы визуально показать на форме. Я даже специально для этого писал метод который считает количество файликов, которое должно получиться, то есть в принципе можно процентное соотношение высчитывать будет. но пока пришлось прогрессбар выкинуть, потому что пока файлики создаются - форма висит, так как поток один, а когда форма отвисает - уже ничего показывать не нужно.

Считал, что тернарный оператор можно только в лямбдах применять. А тут такое… Как там было с квартиркой Антона Семеновича Шпака: “Это я удачно зашел!”

// PascalABC.NET 3.1, сборка 1213 от 04.04.2016
function f(x:integer):=(x.IsOdd?'Нечет':'Чет');

begin
  WritelnFormat('{0}-{1}, {2}-{3}',3,f(3),-2,f(-2));
  var a:=5;
  var b:=3;
  WritelnFormat('{0}>{1}: {2}',a,b,a>b?'Истинно':'Ложно');
  var c:=a=b?a+1:b*b;
  Print(c)
end.
3-Нечет, -2-Чет
5>3: Истинно
9 

P.S. Интересно, что бы с Н.Виртом стало после знакомства с PascalABC.Net 3.1 ? :sweat_smile:

1 лайк

Кстати, интересно: а нельзя ли было бы сделать, чтобы строковые представления True/False зависели от системной локали? Чтобы на компьютерах с русской виндой печаталось “Истина” / “Ложь”…