Перейти к содержанию
Посмотреть в приложении

A better way to browse. Learn more.

Форум Академгородка, Новосибирск

A full-screen app on your home screen with push notifications, badges and more.

Чтобы установить это приложение на iOS и iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
Чтобы установить это приложение на Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Замыкания в C++

  • Ответов 75
  • Просмотры 13,8 тыс
  • Создана
  • Последний ответ

Топ авторов темы

Рекомендуемые сообщения

Опубликовано
С другой стороны, примеры неинтересные, потому что на карриинг, и того же можно добиться и не имея в языке замыканий :)

Явно протаскивая замыкаемые переменные в члены локального класса - ака в моём примере для С++.

А это сильно менее удобно. :)

 

Можно ли в Делфи сделать так:

Func<int> CreateSeq(int start, int end)
{
    return () => start <= end ? start++ : -1;
}

В самой распоследней это будет выглядеть примерно так:

type
  TProc = reference to function: Integer;

function CreateSeq(start, end: Integer): TProc;
begin
  Result := function: Integer;
  begin
    if start <= end then
      Result := start + 1
    else
      Result := -1;
  end;     
end;

См. например здесь.

 

А в С++0х так:

std::function<int> CreateSeq(int start, int end) {
  return [=]{return start <= end ? start++ : -1;};
}

 

Опубликовано
  • Автор
Что-то глядя на подобный код, у меня возникает сомнения в необходимости комитетов и слишком уж активного добавления в язык всего на свете. На кой чёрт в сях нужны все эти приблуды функционального направления и толка? Вот был Фортран - так нет, ООП ему надо. Итог - нечто выглядящее как динозавр, причём сдохший, причём при рождении. Хотя это только мнение.
Опубликовано

Вот и я про то же. То ли дело

MyClassObject[] list = GetSomeList();

 

List<string> names = (

select o.FirstName + " " + o.LastName

from list

where o.Address.IndexOf("Morskoy") >= 0

).ToList();

Пардон если не компилируется..

 

Здесь есть неявные лямбды, и в сочетании с другими расширениями языка код читается отлично. (Это наверное камешек в огород с++. Насколько я понимаю, с# компилятор подставляет дополнительные конструкции в виде объектов и функций для обеспечения корректной работы замыканий и лябд во время компилирования, это скрыто от программиста, и по этому поводу не надо беспокоиться)

Опубликовано
  • Автор
Опять же мнение, уже религиозное - купила Microsoft шарашку известную, и они ударными темпами в ответ тоже на известно что сваяла... ну тоже понятно.
Опубликовано

Python, списковые дополнения:

list = GetSomeList()
names = [
  '%s %s' % (o.FirstName, o.LastName)
  for list if "Morskoy" in o.Address]

 

C Linq тоже не всё гладко:

1. Вводятся новые ключевые слова, причём часто используемые для идентификаторов.

2. При использовании выражения Linq вводятся неявные переменные, имена которых нужно знать/помнить и отслеживать конфликты.

3. Синтаксис select .. from .. where хорошо подходит для списковых или табличных структур. Использование его для деревьев или графов выглядит изрядно криво

4. Создание адаптера Linq для своей структуры довольно трудоёмко (попробуй создать адаптер для запросов к файловой системе)

5. Скорость выполнения конструкции не ясна

 

Кстати, синтаксис списковых дополнений python лучше по всем параметрам, кроме 3 :)

Опубликовано
Python, списковые дополнения:

 3. Синтаксис select .. from .. where хорошо подходит для списковых или табличных структур. Использование его для деревьев или графов выглядит изрядно криво
4. Создание адаптера Linq для своей структуры довольно трудоёмко (попробуй создать адаптер для запросов к файловой системе)
5. Скорость выполнения конструкции не ясна

Кстати, синтаксис списковых дополнений python лучше по всем параметрам, кроме 3 :)

 

re 3: раз калька с SQL, то алгебра - реляционная. Работать с деревьями - пожалуйста, но линейно :) Не знаю, что умеет Linq XML, но уверен что средство весьма удобное.

re 4: Достаточно одного-пары методов, возвращающих списки файлов. В случае БД да, все намного сложнее, так как нужно Linq-запрос в виде выражения (Expression) преобразовать в SQL-запрос к БД или что-то другое для XML. Это потому что хотим, чтобы слияния-сортировки-агрегирование делал SQL-сервер. Иначе:

re 5: если это простой Linq, то есть синтаксическая обертка над соответствующими расширениями IEnumerable<>, т.е. нечто позволящее вместо

var fileList = FS.GetFilesRecursive("\\projects\\alpha\\src")
    .Where(f => f.Ext == "cs")
    .OrderBy(f => f.Length)
    .Select(f => new {FullPath = f.FullPath, Name = f.Name, Date = f.DateModified, Size = f.Length);

написать

var fileList = from FS.GetFilesRecursive("\\projects\\alpha\\src")
    where f.Ext == "cs"
    order by f.Length
    select new {FullPath = f.FullPath, Name = f.Name, Date = f.DateModified, Size = f.Length};

то скорость примерно понятна.

Опубликовано
А давайте еще yield вспомним - это помощнее замыкания будет. Не завести ли отдельную тему для подобных наблюдений и примеров? На JavaScript тоже много интересного можно показать.
Опубликовано

2 olegz Как ты меня фигурно процитировал, такого кода на python не бывает! :D

А так,

про 3 - я об этом и говорю - списки и таблицы

про 4 - здорово, если так, но что-то я не слышал про linq совместимые драйверы для Firebird, MySql, PostgreSQL...

И кстати, всёж-таки откуда берутся имена o и f в ваших примерах?

Откуда я, разбирая произвольный код с linq должен их узнавать?

про 5 вроде понятно - если разработчик драйвера не подговнил, то неявные лямбды должны встроиться, и мы получим (python):

result = []
for item in collection:
  if where_predicat(item):
    result.append(item)
result.sort(key=order_expression)

или короче:

result = [item for item in collection if where_predicat(item)].sorted(key=order_expression)

В python-е содержание спискового включения обрабатывает только интерпретатор. Так что передать его для обработки сервером сильно проблематично. :(

 

Ну а yield, фича конечно класная, но, как мне кажется, несколько из другой оперы.

Ключевые слова здесь "итератор", "ленивые вычисления", "продолжения".

Они как бы перпендикулярны замыканиям, как мне кажется. :)

Опубликовано
замыкания не нужны

Вы совершенно правы. Настоящему джедаю вообще должно вполне хватать ассемблера. Всё остальное — от лукавого.

Ага, ассемблера для машины Тьюринга :)

Опубликовано
  • Автор
Ну а yield, фича конечно класная, но, как мне кажется, несколько из другой оперы.

Ключевые слова здесь "итератор", "ленивые вычисления", "продолжения".

Они как бы перпендикулярны замыканиям, как мне кажется

 

Согласен. Так можно и static любой замыканием обозвать.

 

Кстати, на PDP11 зачастую вообще без ассемблера обходились. Сразу в машинных кодах . Так что я преувеличил про ассемблер. Долой ассемблер! Нужно программировать непосредственным вводом двоичных данных.

 

Лучше в 16-ричном. Понтонвей выглядит.

Опубликовано
замыкания не нужны

Вы совершенно правы. Настоящему джедаю вообще должно вполне хватать ассемблера. Всё остальное — от лукавого.

Ага, ассемблера для машины Тьюринга :)

Да, да, да :).

Кстати, на PDP11 зачастую вообще без ассемблера обходились. Сразу в машинных кодах :). Так что я преувеличил про ассемблер. Долой ассемблер! Нужно программировать непосредственным вводом двоичных данных.

Вы шутите, а у нас были лабораторные работы по Камак, где мы паяли АЦП. Так вот отлаживать это АЦП нужно было вводя простые программы прямо с консоли в кодах, без загрузки какой-либо операционной системы вообще. В BIOS (только он так не назывался тогда, в ПЗУ, короче) Э-60 (или это были MS-1201) был прошит простейший монитор, который позволял вводить данные в ячейки памяти и передавать управление на тот или иной адрес. Это при том, что вообще-то операционные системы были в наличии, загрузить RT-11 не было проблем, наверное, никаких.

 

Взращивали настоящих джедаев, видимо.

Опубликовано
  • Автор
Интересно замыкание нашей темы - от функциональных языков к PDP-11. Какие мои локальные переменные указывают на динозавра компьютерной техники? :rolleyes:
Опубликовано
замыкания не нужны

+1

когда в синтаксис языка добавляют много свистелок и перделок получается Perl С++ и прочие Алголы

когда их убирают, и осталяют только необходимое и часто используемое, получется конфетка, с которой удобно работать

ваш максимализм по поводу "все (лямбды, замыкания и т.д.) или ничего (машинные коды PDP-11)" смотрится блефово

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

 

к лямбдам в C++, C# (и в Питоне кстати) тот же вопрос, зачем? как выглядит код без них и как с ними?

складывается ощущение, что код пишется быстрее, но получается менее читаемый (в частности, потому что функции и классы, создаваемые на лету, не именуются, не документируются) и менее переиспользуемый

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

 

неплохо замыкания выглядят в UI для всяких Listener/Observer'ов...

 

PS. У меня 3 любимых языка программирования С (не плюсы!), Lua & Haskell... 2 из трёх поддерживают замыкания. Но недавно в clang добавили даже blocks, которые closures for C =) *шоке-шоке*

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

Аккаунт

Навигация

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.