Версия PascalABC.NET 3.0

У нас нет такого поведения даже при ускорении из-под оболочки.

Локализуйте ошибку пожалуйста.

Есть версия, что это - из-за строчки

a[i] := PABCSystem.Random(100);

Проверьте

Именно так. Убрал uses System; убрал префиксы &Array, и убрал префикс PABCSystem. Работает без проблем. Птом добавлял назад частями - да, конструкция PABCSystem.Random(n) вызывает слёт системы.

А по поводу предыдущего сообщения (01.02.2016 12:11) пока ничего не можете сообщить?

Известная презентация http://pascalabc.net/downloads/Presentations/PascalABC.NET_2015.pdf на слайде 54 содержит примеры работы с лямбдами в стандартных библиотеках. Но когда я попытался выполнить Пример 3, получил не то, что показано на слайде, а следующее:

Если последнюю строчку закомментировать, мы получим следующие результаты:

// PascalABC.NET 3.0, сборка 1157 от 02.02.2016
begin
  SeqGen(1,x->x+2,10).Println;
  SeqGen(1,x->x*2,10).Println;
  //SeqGen(1,1,(x,y)->x+y,10).Println;
end.
и далее выдача
12
20

И эта выдача совершенно не похожа но приведенную в презентации

Зато выдача эта вполне объяснима если посмотреть справочную систему, более того, если переписать операторы в соответствии со справкой, все начинает работать, как надо.

  SeqGen(10,1,x->x+2).Println;
  SeqGen(10,1,x->x*2).Println;
  SeqGen(10,1,1,(x,y)->x+y).Println;

Вывод - информация в презентации неверна.

1 лайк

Ну, будем искать ошибку. У меня другое поведение, но тоже некорректное.

Да, это ошибка. Исправили. Теперь foreach по многомерным массивам работает верно. Смотрите линейку Твиттера на сайте

Да, исправили презентацию и выложили

1 лайк

А где линейка этого самого Твиттера, ссылочку нельзя?

И - результат работы с последней версией программы.

// PascalABC.NET 3.0, сборка 1157 от 02.02.2016
begin
  // эта часть работает именно так, как ожидатся
  var a:array of array of integer;
  SetLength(a,3);
  for var i:=0 to 2 do begin
    SetLength(a[i],2);
    a[i]:=ArrRandom(2,-8,6);
    a[i].Println // Как же нужен PrintlnFormat !!!
    end;
  Writeln('------');
  foreach var row in a do begin
    foreach var elem in row do Write(elem:3);
    Writeln
    end;
  Writeln('=======================');
  var b:=MatrixRandom(3,2,-8,6); Writeln(b);
  Writeln('-----------------------');
  foreach var e in b do Write(e:3); Writeln;
  // а вот тут почему-то обнаружилась засада
  Writeln('=======================');  
  foreach var e in a do Write(e:3)
end.

Вот такая выдача получается:

5 -8
0 -3
-4 5
------
  5 -8
  0 -3
 -4  5
=======================
[[-7,4],[-3,5],[-5,4]]
-----------------------
 -7  4 -3  5 -5  4
=======================
System.Int32[]System.Int32[]System.Int32[]

Исправили

4 posts were split to a new topic: Предварительное объявление классов

Присматриваюсь к функции Rec с тем, чтобы использовать её на первом курсе для возврата нескольких значений из функции во втором семестре (надоели мне выходные параметры — неправославно нефункционально!). Проблема в том, как обойти «неизвестный» тип. В сокращённом синтаксисе определения функции всё ОК, тип выводится:

function f := Rec(1,2);

А что делать, если нужно полное описание? Нет ли аналога auto для возвращаемого типа? :grinning:

На выбор:

function f: (integer,integer) := Rec(1,2);

function g: (integer,integer) := (1,2);

function h: System.Tuple<integer,integer> := (1,2);

begin
  Println(f,g,h);
end.
1 лайк

ОООО, божественно, спасибо!

1 лайк

В дисплейном классе надо сразу установить новую версию

Посмотрим, спасибо.

На сайте в “Новостях”:

12.02.16. Вышла версия 3.1. Добавлены кортежи в стиле (a,b) и кортежное присваивание (a,b) := (b,a)

Для скачивания доступна версия 3.0, сборка 1164 от 11.02.2016. А тогда как понимать термин “Вышла”? Автор этой новости пользуется какой-то особенной семантикой? И еще, где-то о новациях версии 3.1 можно будет узнать подробнее фразы “добавлены кортежи”? Ведь у нас уже есть увлекательное занятие по “раскапыванию” приемов работы с новинками версии 3.0 путем чтения информации по работе в среде .NET с языками C# и VB (а как иначе? Я вот недавно обнаружил, что в версии 3.0 ЧАСТИЧНО поддерживается тип Complex: перегружены все четыре арифметические операции, а вот Conjugate, например, не распознается). Точнее, она распознается конечно (русским мужикам, как говорится, нет проблем что-то расковырять), но недостаточно объявить uses System.Numerics, надо явно писать System.Numerics.Complex.Conjugate() или не совсем понятное Complex.Conjugate()

1 лайк

Да, виноваты - забыли закачать вчера.

Закачали.

Новое в 3.1 опишем позже - здесь на форуме. Еще позже - в справке. И еще позже - в презентации на сайте. Пока не успеваем.

Специально для Вас - сделали тип Complex стандартным (не надо подключать System.Numerics), определили для него пока функцию Cplx(re,im) и метод c.Conjugate. Остальные методы надо пока вызывать как статические класса Complex: Complex.Sqrt©.

Пишите, что еще не устраивает.

Спасибо огромное! Дело даже не столько во мне, сколько в отдельных “пайтонманах”, которые в перерывах между нервным курением бамбука восклицают из своего угла: “а с комплексными-то не работает, а у нас - нет проблем!”. А теперь еще и кортежи… )))

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

Пишите, что еще не устраивает.

Как может что-то “не устраивать” в некоммерческом продукте? Не устраивает - никто не принуждает пользоваться! Но если вдруг окажется, что есть возможность сделать, как кажется лучше, удобнее - почему не попросить?

Фактически уже мертвый Паскаль вдруг получил “вторую жизнь”, да еще и стал таким осовремененным - спасибо команде разработчиков за их нелегкий труд, а теперь впереди еще более тяжелый: сделать его одним из базовых языков в системе образования. А это, в первую очередь, переучивание преподавательского состава с их вечным “А зачем? А чем лучше? А оно того стоит? А наши дети поймут?”… Вопросы, за большинством которых стоит один: “А пойму ли это я, да еще так, чтобы объяснить?”. Чем более крупными объектами сможет манипулировать язык, тем проще будет на нем начать работать. И превосходно, что нам дают готовые стеки, словари, списки, динамические массивы, последовательности и LINQ to Objects, как и многое другое. Прекрасно, что вместе с BigInteger втихомолку подключили RegEx, а теперь и Complex. Осталось договориться, чтобы устроители олимпиад включили “Pascal-2016” в тестирующие системы - и тогда учащиеся (пусть сначала хотя бы их небольшая часть) получат мощный стимул к изучению этой, действительно удобной и мощной системы программирования.

2 лайка

Ой, спасибо за хвалебный отзыв :slight_smile:

Тем не менее, критикуйте. Несмотря на то, что продукт некоммерческий, самые важные вещи - предмет нашего пристального внимания.

По поводу комплексных чисел - посмотрите, какие еще функции для работы с ними нужны. Там есть всякие Sqrt и sin и что-то там с полярной системой - к ним пока можно обращаться через имя класса Complex.Sqrt. Думаем сделать их просто перегруженным Sqrt, но пока думаем. В своё время в лихие 90-стые я писал свою библиотеку работы с комплексными - так что эта тема мне близка.

По поводу питонистов - уже у наших преподавателей тоже есть такие высказывания. Мы учим и на Питоне тоже. Питон обеспечивает синтаксическую лёгкость и большой набор библиотек на все случаи жизни. Вот PascalABC.NET как раз выбивает у него все эти козыри. Отчасти введение коротких функций Arr, Seq, HSet, SSet, Dict, Lst для создания коллекций взято из Питона. Лямбда-выражения - легче чем в Питоне. Длинные целые, комплексные числа - вот уже появились.

Вообще, изменения в современных языках программирования - большие. На мой взгляд, все они примерно связаны с тем, что Вы отчасти говорите. Во-первых, возможность работы с более крупногабаритными объектами как с единым целым (кортежи, лямбда-выражения, стеки, списки, последовательности). В CS такие объекты называют first-class objects. Во-вторых, синтаксическая легкость и разработка новых синтаксических конструкций (так называемого синтаксического сахара), нацеленных на эту лёгкость. В третьих, библиотеки добавляют к этим объектам множество стандартных операций.

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

Если смотреть на процесс обучения с этой точки зрения, то почти неважен язык, на котором учим - надо только сказать, как на нем обеспечиваются все эти примитивы. Язык, правда, должен быть современным. Но мы ж на других и не учим? :slight_smile:

Я писал свою свою библиотеку для работы с комплексными примерно тогда же, потому что в связи тихой кончиной эпохи System /370 надо было как-то продолжать работать на “персоналках” со всем, что успели написать на PL/1 и Fortran-IV, а “Трубо Паскакаль” (возможно, Вы помните все эти “Break Watch - чьи часы ломаем?” ) на фоне вычислительных возможностей PL/1 с его комплексной арифметикой, срезами массивов и выражениями, где “можно всё”, выглядел, как цыпленок на фоне страуса. Отсутствие в Паскале тернарной условной операции, которую Н.Вирт не пожелал переносить из Algol-60, ограничение параметра цикла со счетчиком простым целочисленным инкрементом/декрементом - да одно это после возможностей PL/1 вызывало в адрес ущербного Паскаля “много нехороших слов”. Это было сродни переходу с ADABAS (или даже его русского младшего брата - СУБД “СПЕКТР”) на dBASE-II и нантакетовский Clipper. Если бы тогда Fox Software не ввела в свою FoxPro первые, пусть скромные, но все же SELECT SQL-операторы, - кто знает, возможно персоналки так бы и остались игрушкой для детишек, а взрослые дяди и тети держали бы на них “базы данных для дантистов и юристов”. Теперь шаг подобного уровня сделала Microsoft, введя в .NET поддержку LINQ - по сути тот же SQL, встроенный в язык. Да, SQL - не всегда идеальный язык для манипулирования данными и поэтому приходится придумывать курсоры, а используя LINQ по той же причине мы вынуждены прибегать к foreach (это привет foreach из 4GL !), но LINQ с лямбдами - это путь к функциональному программированию, манипулированию агрегатированными данными как единым объектом, это путь к смене старого мышления, к отказу от поэлементного перебора в циклах, это строительство дома из блоков, а не отдельных кирпичей. И учить этому массово надо со школьной парты.

На мой взгляд, ошибка школьной образовательной концепции в информатике состоит в том, что мы массово пытаемся из ребенка сделать несчастное подобие программиста, забивая ему голову деталями, которые он по мере сдачи материала, успешно и навсегда забывает. Программист - не самая простая в мире профессия, но мы упорно натаскиваем на нее школьников на смешной часовой сетке занятий. Почему-то школа не ставит целью “впихнуть” в школьника материал аналогичной сложности и уровня по другим предметам! Да, немного ситуацию улучшило разбиение на профильные и непрофильные классы, но извините: когда я слышу “Да зачем этот Паскаль, учитель сказал, что это пустая трата времени и мы будем учить Си”, - мне становится жаль этих детишек, которые на первом занятии напишут “Hello World!”, а следующие три месяца не напишут ничего, потому что … ну, те кто С/С++ учили, меня поймут.

В свое время мне довелось несколько лет в РИНХе (ныне РГЭУ) вести курс баз данных и мы в силу определенных обстоятельств сломали стереотип о заведенном порядке преподавания вычислительных дисциплин. Мы ввели курс баз данных сразу у студентов со второго по четвертый курсы с тем, чтобы постепенно перевести базы данных во второй и третий семестры. И, хотя сначала мне многие не верили, первый и второй курс писал программы, а потом и делал курсовую не хуже четвертого. Мы взяли за основу FoxPro 2.0 (ничего мощнее тогда не было), в котором уже были основные операторы SQL - и дело пошло. Надо сказать, что кроме манипулирования данными, в FoxPro были заложены прекрасные идеи, многие из которых обогнали свое время. Вычисления, многие из которых были, как сейчас говорят, “ленивыми”, бестиповые переменные (наша радость и беда одновременно, но легко принимаемые в обучении, ведь Пайтон пошел по этому пути?), автоматическая сборка мусора, динамическое “все”; более того, в FoxPro массив - по факту набор ссылок, поэтому p[i] может быть в данный момент вещественным, а p[i+1] хранить пару гигабайт бинарного кода. Да, это “форменное безобразие” с точки зрения канонов программирования, которое так сходу не объяснишь, но вопрос в другом - а надо ли объяснять? Откажемся ли мы кушать по причине того, что не знаем, как процесс пищеварения происходит? Нет? Тогда почему мы должны отказывать школьнику работать с современными концепциями программирования, пользоваться объектами, представляющими информационные структуры лишь потому, что он пока что не может написать все это с помощью трех операторов - следования, “развилки” и перехода? Наших детей учат азам информатики на массивах из тетрадных клеточек, вместо того, чтобы открыть перед ними электронную таблицу, где одномерный массив - это строка или столбец, а двумерный - просто некая прямоугольная область? Потому что Эксель кто-то шибко мудрый решил изучать “потом”? Экселя нет? Ну что же, можно пользоваться, например, таблицами прямо в Гугль Хром - они там и встроенные, и бесплатные. Так может лучше “потом” изучать как устроены и обрабатываются в программе все эти биты и байты, когда мы научимся данными осмысленно оперировать? Ничего, что ребенок сначала учится из кубиков строить домики, а гораздо позднее узнает, что такое дерево, пластмасса, как правильно создавать эти самые кубики и т.д.?