лекции (2015), страница 8

PDF-файл лекции (2015), страница 8 Языки программирования (53868): Лекции - 7 семестрлекции (2015): Языки программирования - PDF, страница 8 (53868) - СтудИзба2019-09-19СтудИзба

Описание файла

PDF-файл из архива "лекции (2015)", который расположен в категории "". Всё это находится в предмете "языки программирования" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .

Просмотр PDF-файла онлайн

Текст 8 страницы из PDF

Базовый класс - в нём переопределяем особый вызов родительского base.fm() +делегатский тип данныхСначала не было ничего и надо ?непонятный набор букв похожий на “поре платив”? писать, нопотом появились анонимные классыButton b1, b2,b3;b1 = new Button {protected void onClick() {...super.onClick();}}b2 = …; //тут b2 заменяем без необходимости реально создавать много классов. Тут появилсятермин closure - замыкание{если переменные видны где-то в области; используя внутри нек. области, то она захватывается ипри необходимости видна и вне}33Делегаты в С#.

Ключевое слово eventОбычный процедурный ТД. Крайне ограниченная функц-ть, обычно имеет вид “подписка” ”рассылка”. Язык C# тем не менее включает в себя понятие «делегаты», аналогичноефункциональному типу, но не основанное непосредственно на концепции указателя и являющеесяболее надежным.Делегат – это тип, который представляет собой ссылки на методы с определенным спискомпараметров и возвращаемым типом. Делегаты используются для передачи методов в качествеаргументов к другим методам.Делегаты обладают достоинствами функционального типа данных, и в то же время не имеют егонедостатков.

Внешне объявление делегата очень похоже на объявление функционального типа.Объявление делегата начинается с ключевого слова delegate, за которым идет спецификацияфункции:delegate - только внутри какого-то классаclass X {delegate void f(int); /* в System есть Delegate и цепочкиделегатов;теперь можно писать f d; операции:*/1) :=class y{void m(int p){...}static void R (int i){} //оба полностью удовлетв. виду f}}y = new Y();d = y.m; //ссылка на методd = y.R; //просто функция{//надо было писатьd = new f(y.m);d = new f(y.R);}2) К экземпляру делегата можно применять следующие операцииИзначатьно значение делегата пустое● = - присваивание● += добавление функции● -= удаление функции● вызовПрисваивание делегату какой-то функции - стирает всё содержимое делегата и создает в нёмсписок из одной функции, += добавляет в список ещё функции(удовлетворяющие видуделегата)Теперь операция вызова делегата будет вызывать по очереди все функции из списка,передавая каждой функции аргументы из вызова3) () d(0) - каждый метод вызываетя с параметром 0, порядок не определен.“+=” - “подписка” “()” - “рассылка” //в лекциях 2012 года () называют уведомлениемf d; - каждый может сделать +=, -=, (), =(т.е.

удалить всех), хочется, чтобы был владелец и могчто-то делать, но все ТД единообразны -> !делегаты не являются типом данныхevent - специальное новое ключевое слово, появилось в 99 году. реализует “подписку-рассылку”,является модификатором переменной делегатского типа. + появилась возможность захвата (closure)И если область делегата в области видимость в области видимости local, то local захватывается.События это особый тип многоадресных делегатов, которые можно вызвать только из класса илиструктуры, в которой они объявлены (класс издателя).Если на событие подписаны другие классыили структуры, их методы обработчиков событий будут вызваны когда класс издателя инициируетсобытие.{delegate (int x) {return 2*x;}}34delegate event Run(int x);{ Run f; T local;f = delegate (int x) {return 2*x + local;}}Лямбда-функции●В Python всё простоf = lambda x: 2*xprint(f(1)) // 2Можно использовать замыкания (захват переменных):y = 5f = lambda x : x + yprint(f(3)) // 8Лямбды в питоне могут содержать только одно выражение, результат которого являетсярезультатом функции.Таким образом лямбды являются чистыми функциями (без побочных эффектов).

Нельзяменять переменные из лямбд-замыканий●JavaScriptfunction f(x) { return 2*x; } //определяет функциюfunction g() {...y = 1;function f(x){return x+y;}return f;} // захват уфункции в js - это объекты первого порядка (их можно передавать как аргументы в функции,присваивать переменным и т.п.).Вообще это не лямбда, а замыкание (Closure, захват переменных).Лямбда функция в JS выглядит так:var lambdaSum = function(a, b) { return a + b; };Основная суть лямбд - анонимность (имя функции не обязательно):var sum = [1,2,3].reduce(function(a, b) { return a + b; }); // sum = 6(сумма элементов)Можно еще так писать:var sum = [1,2,3].reduce(lambdaSum);Или даже так:function sum(a,b) { return a + b; }var sum = [1,2,3].reduce(sum);В стандарте языка JS под названием ES6 (он же ES2015) можно писать так:var sum = [1,2,3].reduce( (a,b) => a + b );var sum = [1,2,3].reduce( (a,b) => { return a + b; } );Использование Лямбда + Замыкание:var delta = 10;35var oldArray = [1,2,3];var newArray = oldArray.map(function(n) {return n + delta;});// newArray = [11,12,13]В отличие от Java/Python, замыкания могут изменять переменные:var value = 10;function subtract(n) {value -= n;return value;}var result = subtract(4); // result = value = 6●В компилируемых языках программирования надо добавить делегатов.С#.

(x) => 2*x ⇔ x => 2*x //генератор делегатов, это выражениеdelegate int Run(int)Run f;f = x => 2*x // тут происходит генерация делегата,// идет вывод типа из определения делегата (инт){//есть generic -> можно написатьRun <int, int>Libor<int> ⇔ void Libor(int)}Заметим, что лямбда-выражения не могли появиться без обобщений( generic)● Java. захват, в 2005 появились обобщения, в 2014 в Java8 окончательно появились лямбдафункцииОбщий вид: (список параметров) -> выражение.

// на фото 914 есть пара примеровиспользования.Андрей ([915-924], завершено)Функторы и лямбда-фукнции в С++Если в классе перегружен operator(), то такой класс называется функтором. Это какальтернатива лямбдам.Например можно делать свертки:Есть стандартная функция в <algorithm>:count_if(f1, f2, predicate)где f1 и f2 - итераторы, predicate - функтор от одного аргументаона может принимать как указатель на функцию типа bool (*)(int), либо объект класса сперегруженным operator().В Си++11 появились лямбда-функции:count_if(f1, f2, [](int n) { return n%2 == 0; });Семантика как в лиспе, даже замыкания есть.Про них подробнее тут: http://en.cppreference.com/w/cpp/language/lambdaЕсли внутри блока идет обращение к глобальным переменным, или переменным функции, внутрикоторой создается лямбда, то будет ошибка, т.к.

захват контекста (замыкание) по-умолчанию36выключен. Чтобы включить, надо писать [&] или [=] или [varname] или [&varname] (смотри поссылке выше).Можно даже писать [=, &x, &y]. (Захват x и y по ссылке, остальных по значению)А еще появился обобщенный класс function в библиотеке <functional>. Его можноиспользовать для объявления функций высшего порядка.В Java есть лямбды, но там захват переменных можно делать только read-only.Модульность (C++, Модула-2, Oberon)C++typedef не определяет нового типа, а только создает алиас.Потому что при создании нового типа можно перегружать функции, ноtypedef int newtype;void f(int);void f(newtype);выдает ошибку.Единственное, что в плюсах создает новый тип - это директива class.Физический модуль - это единица компиляции (трансляции)Часто логический и физический модули совпадают (как в плюсах)Модула-2Модули бывают локальные и глобальные (библиотечные).

Весь код по умолчанию пишется вглавном локальном модуле. Локальный модуль содержит и объявления и реализацию.Структура локального модуля:MODULE ModuleName… definitions …BEGIN… module code …END ModuleNmae;module code будет выполнен сразу при инициализации модуля. Поэтому он и используется как точкавхода в программу.Глобальные модули нужны для написания библиотек. В них код разделяется на определения(заголовки) и реализацию. Определение и реализация пишутся в разных файлах. Имя файла какправило совпадает с именем модуля.Файл HELLO.DEFDEFINITION MODULE HelloEXPORT Hello;PROCEDURE Hello;END Hello;Файл HELLO.MODIMPLEMENTATION MODULE Hello;FROM Terminal2 IMPORT WriteString, WriteLn;PROCEDURE Hello;BEGINWriteString(“Hello”);WriteLn;END Hello;37END Hello;TYPE T;PROCEDURE INIT_T(VAR P:T);DESTROY(VAR P:T);Это реализация абстрактного типа данных, внутренней стркутуры которого мы не знаем.У модулей в Модуле-2 можно задать специальную маску устойчивости:MODULE M[4];4 воспринимается как битовая маска.

Суть этой маски в том, что она запрещает некоторыепрерывания при выполнении модуля M.Еще в Модуле-2 есть сопрограммы, но это уже совсем другая историяOberonНет разделения на определение/реализацию, нет главного модуляВсе модули могут экспортировать процедуры типа PROC.MODULE MTYPE Obj* = RECORDX : INTEGER;Y* : INTEGER; ← Экспорт отдельных полей структурыEND;PROCEDURE P*; ← * - значит экспортVAR Done*- : Boolean; ← *- - значит только на чтениеEND MЗа пределами модуля нельзя обращаться к X:VAR V : M.ObjV.Y = 1; ← МожноV.X = 1; ← НельзяВ этом языке к содержимому импортированного модуля можно обращаться только через точку,нельзя как в Модуле-2, импортировать конкретный объект. (см.

ниже)Допускается создать псевдомодуль только с выделенными именами (?)Логические модули (Modula-2, C)Есть в языках Ада, Оберон, Модула-2, Эйфель, … - все основаны на понятии модуля, как на понятииконейнера языковых ресурсовМожно определить интерфейс модуля (перечисление того, что надо экспортировать и реализацию.Тогда реализация экспортирует все в глобальное пространство имен(wtf?)Вообще видимость и доступность - это разные понятия.Видимость бывает двух типов:38а) непосредственная (прямая, доступ к имени модуля/функции/переменной без точки, напримерWriteString)б) потенциальная (доступ к имени только через уточнение модуля/объекта с помощью точки,например Terminal2.WriteString)Modula-2В модуле-2 доступно все что видно (нет модели доступа - все что видим, можно брать)Непосредственно видимы только стандартные имена и имена библиотечных модулей (определениймодулей)Импорт позволяет подгрузить дополнительные модули:IMPORT <список имен модулей>IMPORT M;Доступ после импорта все-равно через точку: M.PХотя можно делать и непосредственный импортFROM M IMPORT P;При компиляции файл с определением модуля M.DEF переходит в M.SYMА файл с реализацией модуля M.MOD переходит в M.OBJC#ifndef FILENAME#define FILENAME...#endifСтандартная защита от повторного включения заголовочных файловextern нужно писать только в заголовочных файлах, но переопределять чужим typedef (wtf?)Модульные языки (Delphi, Object Pascal, Ада)Turbo Pascal, Ada, Modula-2, OberonВ простом случае Модуль - это набор ресурсов, которые можно реиспользовать, а не создаватьзаново.Любой класс - это модуль.DelphiМодульный подход как в Модуле-2, но ОО (объектно-ориентированный?)Общее глобальное пространство именВидимость: потенциальная, непосредственнаяПорождение имен - определяющее (должно быть одно, если без перегрузки), использующиеНепосредственно видимы только именя библиотечных модулейИмпорт: uses M;Все имена непосредственно импортируются (без точки можно юзать)Object Pascalunit:interface ← переходит таблицу символовimplementation ← переходит в obj-файл39Итого получаем, что программа - это набор модулей.

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5301
Авторов
на СтудИзбе
417
Средний доход
с одного платного файла
Обучение Подробнее