Ниша PascalABC.NET

Мы наверное в спрвке назовем его “оператор сопоставления с образцом”

Ну, это длинный и официальный вариант. Он конечно нужен, но что насчёт по короче, то что можно быстро написать как патерн мачинг?

А может быть вы как-то подробнее сделаете обзор лямбд и функциональной части языка? Как бы в это войти относительно безболезненно? Ну так чтобы охоту учиться программировать не отбило из-за непонимания. Или это у вас уже есть где-нибудь? Процедурная часть она и на старом паскале описана в книжках всяких. А вот функциональная и ооп - очень тут не хватает этого. Справка дается с большим трудом по этим делам. Приходится читать C# Шилдта и рыться в интернетах. =(

Это в Помощь новичкам.

http://pascalabc.net/downloads/Presentations/Tutorials/ProcFuncLambdas.pdf

Тут пара слайдов есть. Напишите, что непонятно

1 лайк

Угу, спс, когда-то пробовал это читать и не зашло. Потом забросил и занялся другими вещами оставил на потом. Сейчас снова прочитал. Про процедурные переменные вроде бы понятно. А вот чуть дальше процедурные переменные - функции : var a : real -> real := sin; вот тут пока ступор -> что, откуда, почему %. Чуть дальше читаю: “Лямбда-выражение – это анонимная функция, которая описывается в месте использования.” Ага, где-то я что-то читал или смотрел про анонимные функции, то ли в javascript? Рыть javascript? А по-другому нельзя?

Ну там же дальше есть пример, прочитайте его:

begin
  var a := Arr(1,2,3,4,5,6,7,8,9);
  a
  .Where(x -> x mod 2 = 0)            // Выбрать все чётные
  .Select(x -> x*x)                   // возвести их в квадрат
  .Println;                           // и вывести
end.

Это то же самое что

function Cond(x: integer): boolean;
begin
  Result := x mod 2 = 0;
end;

function Fun(x: integer): integer;
begin
  Result := x*x;
end;

begin
  var a := Arr(1,2,3,4,5,6,7,8,9);
  a
  .Where(Cond)
  .Select(Fun)
  .Println;
end.

Не понятно, а .Where и .Select это что такое? это какие-то методы для массива? Внутри параметры функции? Надо с чего-то простого начинать, наверное. =(

Хорошо, вот вам пример легче.

function Подставить5В(f:real->real):real;//Первый параметр тут это функция принимающая
                                         //число типа "real" и возвращающея другое число,
                                         //тоже типа "real"
begin
  Result := f(5);//Тут мы вызываем функцию которую передали как параметр, давая ей 5 на вход
end;

function УмножитьНа2(r: real): real := r*2;//эта функция берёт число и возвращает его же, умноженое на 2

function ВозвестиВКвадрат(r: real): real := r*r;//эта функция берёт число и возвращает его же, возведённое в квадрат

begin
  writeln(Подставить5В(УмножитьНа2));       //Тут мы передаём в "Подставить5В" функцию, которая умнажает входное число на 2
                                            //При выполнении в функцию "УмножитьНа2" подставит 5, а затем выведет результат
                                      
  writeln(Подставить5В(ВозвестиВКвадрат));  //Тут мы передаём в "Подставить5В" функцию, которая возводит входное число в квадрат
                                            //При выполнении в функцию "ВозвестиВКвадрат" подставит 5, а затем выведет результат
end.

Это же можно записать так:

function Подставить5В(f:real->real):real;
begin
  Result := f(5);
end;

begin
  writeln(Подставить5В(r->r*2));
  writeln(Подставить5В(r->r*r));
end.

То есть тут мы функции УмножитьНа2 и ВозвестиВКвадрат заменили лямбдами. Лямбды работают так же как и полные функции, но их можно описать прямо на строке где вы их используете, не создавая дополнительные имена (УмножитьНа2 и ВозвестиВКвадрат) и сильно экономя на количестве кода.

P.S. @admin перенесите всё же в помощь новичкам, пожалуйста.

1 лайк

Почти, это методы для последовательностей. А массивы это 1 из видов последовательностей, поэтому для них работает.

Если Вы не думаете, конечно, что PascalABC.NET - это из языков “пришел - и через 5 минут спец”, то начните с простого: девяти видеолекций от разработчика.

Лекция 1. https://youtu.be/U65-SebSaj416
Лекция 2. https://youtu.be/Bqfpddge2c04
Лекция 3. https://youtu.be/dC05q_CIIe42
Лекция 4. https://youtu.be/ywFGkKkA3r4
Лекция 5. https://youtu.be/V4jbPonynAU
Лекция 6. https://youtu.be/wFcAq-1mnx0
Лекция 7. https://youtu.be/FCM_YaZyWVQ
Лекция 8. https://youtu.be/lE05l_RYqsc
Лекция 9. https://youtu.be/AjtBMQ26YPc

Без этого материала при попытке писать программы будете себя чувствовать примерно так, как описано в “12 стульях”:

…посетители сперва ударялись о кассу, а потом на них падал скелет. Беременные женщины были очень недовольны…

1 лайк

Воот, это уже ближе к телу =). Благодарю за ссылки. Уже немного посмотрел – нравитца! Конечно я не думаю, что стану спецом в паскале за 5 минут. Может быть…:roll_eyes: за десять?:grinning:

Надо сделать специальную простую презентацию по лямбдам

Нашёл отличное эссе по теме недавней дискуссии в этой ветке с ответами на многие мои вопросы.

stolyarov_2010 (1).pdf (245,3 КБ)

1 лайк

Интересная презентация, причём с 2010 года позиция Автора сильно укрепилась: “Hello, World!” на Паскале выглядит уже не так

Program HelloWorld;
Begin
  WriteLine('Hello, World!');
End.

а так:

Begin
  WriteLine('Hello, World!');
End.

А C/C++ и ныне там.

begin
  Println('Hello, World!')
end.

За Write/Writeln без причины - минус в карму :smile:

P.S. Точку с запятой перед end ставят только упёртые С-маны

Ну, Вы считаете, что позиция автора в целом совпадает с вашей позицией?

Нет, конечно. Она, скорее, совпадает с вашей.

Если по тексту, мне не нравится эта позиция и она мне кажется устаревшей.

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

Что касается меня, то я примерно с 2000 года не могу принимать Паскаль в облике Free pascal. Собственно, моё мнение о том, что он устарел уже тогда трансформировалось в создание нашей системы.

Наши студенты в 1 семестре сейчас активно работают с последовательностями, оператором yield, лямбдами, захватом переменных. Как это сделать на С и уж тем более на FP - ума не приложу

А оно надо - над этим думать? Для чего тогда было PascalABC.NET разрабатывать?