Мы наверное в спрвке назовем его “оператор сопоставления с образцом”
Ну, это длинный и официальный вариант. Он конечно нужен, но что насчёт по короче, то что можно быстро написать как патерн мачинг?
А может быть вы как-то подробнее сделаете обзор лямбд и функциональной части языка? Как бы в это войти относительно безболезненно? Ну так чтобы охоту учиться программировать не отбило из-за непонимания. Или это у вас уже есть где-нибудь? Процедурная часть она и на старом паскале описана в книжках всяких. А вот функциональная и ооп - очень тут не хватает этого. Справка дается с большим трудом по этим делам. Приходится читать C# Шилдта и рыться в интернетах. =(
Это в Помощь новичкам.
http://pascalabc.net/downloads/Presentations/Tutorials/ProcFuncLambdas.pdf
Тут пара слайдов есть. Напишите, что непонятно
Угу, спс, когда-то пробовал это читать и не зашло. Потом забросил и занялся другими вещами оставил на потом. Сейчас снова прочитал. Про процедурные переменные вроде бы понятно. А вот чуть дальше процедурные переменные - функции :
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 из видов последовательностей, поэтому для них работает.
Если Вы не думаете, конечно, что 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 стульях”:
…посетители сперва ударялись о кассу, а потом на них падал скелет. Беременные женщины были очень недовольны…
Воот, это уже ближе к телу =). Благодарю за ссылки. Уже немного посмотрел – нравитца! Конечно я не думаю, что стану спецом в паскале за 5 минут. Может быть… за десять?
Надо сделать специальную простую презентацию по лямбдам
Нашёл отличное эссе по теме недавней дискуссии в этой ветке с ответами на многие мои вопросы.
stolyarov_2010 (1).pdf (245,3 КБ)
Интересная презентация, причём с 2010 года позиция Автора сильно укрепилась: “Hello, World!” на Паскале выглядит уже не так
Program HelloWorld;
Begin
WriteLine('Hello, World!');
End.
а так:
Begin
WriteLine('Hello, World!');
End.
А C/C++ и ныне там.
begin
Println('Hello, World!')
end.
За Write/Writeln без причины - минус в карму
P.S. Точку с запятой перед end ставят только упёртые С-маны
Ну, Вы считаете, что позиция автора в целом совпадает с вашей позицией?
Нет, конечно. Она, скорее, совпадает с вашей.
Если по тексту, мне не нравится эта позиция и она мне кажется устаревшей.
Но даже дело не в этом. Я считаю, что существуют разные модели обучения у разных преподавателей и вполне успешные. И надо давать право на их существование даже если ты не согласен. Личность преподавателя там порой перевешивает все минусы. Несомненно, существует много неуспешных моделей.
Что касается меня, то я примерно с 2000 года не могу принимать Паскаль в облике Free pascal. Собственно, моё мнение о том, что он устарел уже тогда трансформировалось в создание нашей системы.
Наши студенты в 1 семестре сейчас активно работают с последовательностями, оператором yield, лямбдами, захватом переменных. Как это сделать на С и уж тем более на FP - ума не приложу