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

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 тыс
  • Создана
  • Последний ответ

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

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

Опубликовано
2 fenster

Все твои мерседесы и ужосы являются исключительно твоими и к делу не относятся. :)

Да понятно, я же так и написал сразу, что моё мнение к теме не относится. Тема просто такая, что можно и порассуждать о применимости языков.

 

Плюсы C++ понятны, тема не о них :) Но называть C++ мультипарадигменным без дополнительных комментариев я бы всё же поостерёгся. Правильнее было бы написать, как на рекламных щитах: мультипарадигменный*, с мелким шрифтом внизу.

Опубликовано

Вообще-то мультипарадигменность С++ - один из побудительных мотивов разработки языка.

Можешь назвать язык поддерживающий больше парадигм?

Почитай "Дизайн и эволюция С++" Страуструпа - там всё вполне доступно изложено. :)

 

Опубликовано

Читал, конечно, ещё в студенчестве. Книжка, насколько я помню, рассказывает не столько о том, как планировалось сделать язык мультипарадигменным, а скорее о том, как ввести в си ООП, шаблоны и прочее, не проиграв в производительности и максимально оставив совместимость с существующим кодом (типа, почему выбрали слово using в качестве ключевого и т.п.). В производительности не проиграли, но надо же понимать, что совершенно некорректно сравнивать язык, код на котором компилируется в бинарник, с любым языком, поддерживающим eval и анонимные функции (перл вон тот же). Вернёмся, например, к теме. Какой язык лучше поддерживает замыкания -- компилируемый C++ или интерпретируемый перл, в котором просто и незатейливо делается

sub make_counter
{
        my $value = 0;
        return sub {
                $value++;
                return $value;
        };
}

 

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

 

P.S. Раз уж мы о книжках, то в свою очередь могу предложить полистать второй том Хювёнена - Сеппянена, который у меня даже выложен (первый тоже, но он к теме меньше относится).

Опубликовано

Пример примочки из другого языка, С#. Лямбды хороши в linq, например код с#

(select o.id from objects where o => o.name.EndsWith("nov")).ToList()

здесь o => o.name.EndsWith() лямбда,

переводится linq в запрос sql вида select id from objects_table where o.name like "%nov". Приятно..

Опубликовано

2 fenster Видимо ты какой-то свой особый смысл вкладываешь в слово "мультипарадигменность".

Я согласен с соответствующей статьёй в википедии.

У тебя есть какое-то своё, отличное мнение?

 

Eval - вообще не в кассу. Он доступен напрямую только для интерпретирующих языков.

И является, IMXO, как и текстовые макросы, низкоуровневым средством метапрограммирования.

Примерно как GOTO является очень низкоуровневым средством управления потоком выполнения. :)

 

Ну и возвращаясь к теме, лямбды уже вошли в будующий стандарт С++0х.

Здесь и здесь описание на русском.

Здесь пропосал.

Опубликовано
Ну и возвращаясь к теме, лямбды уже вошли в будующий стандарт С++0х.

 

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

 

(вместо вычурно, я обычно употребляю другое слово, но здесь могу и забанить :smoke: ).

 

 

 

Опубликовано

Да поровну примерно. :)

Главное что с их помощью таки можно кратко изобразить вычисление. :)

 

Вон в дельфе распоследней тоже "лямбды" ввели, но меня корячит именно от многословности их определения.

 

А с вычурностью у С/С++ всегда было всё хорошо. :D

Опубликовано
2 fensterЯ согласен с соответствующей статьёй в википедии.

У тебя есть какое-то своё, отличное мнение?

Я вполне согласен с этой статьёй. Кстати, там вполне прямо указаны языки, поддерживающие больше парадигм, чем C++ :) И функциональной парадигмы среди поддерживаемых плюсами там не указано.

 

Начал писать ответ про eval и понял, что не могу сформулировать, на какую тему мы тут спорим. Я утверждал, что практически на любом языке можно писать практически в любой парадигме, вопрос только в сложности этого. Я также утверждал, что C++ не очень хорошо приспособлен к функциональной парадигме. В общем, я продолжаю это утверждать. Что там будет в стандарте C++0x -- погляжу внимательно.

Опубликовано

Собственно я придрался к твоим словам "называть C++ мультипарадигменным без дополнительных комментариев я бы всё же поостерёгся" (ну нудный я)

Стало интересно чем же всё таки С++ не мультирарадигменный и что это за дополнительные комментарии. :)

Так и не понял. :(

 

Ну а с принятием в составе C++0x лямбд и автовывода типов функциональную парадигму можно будет смело дописывать. :)

 

Ну и про поддержку парадигм языками, ИМХО, это означает что в языке явно присутствуют элементы облегчающие написание кода в рамках этой парадигмы.

В случае с ФП и С++ - ФВП у нас были, а вот простых методов создания и манипулирования функциями не было. Теперь будут. :)

Опубликовано
2 Перерожденец Да вроде с этим всё просто:

В Pascal локальная функция имеет доступ к внешним переменным - явная поддержка.

В java локальные классы имеют доступ к внешним переменным - явная поддержка.

В обоих случаях "доступ к внешним переменным" не имеет с замыканиями ничего общего. Можете пример привести, возможно я не контексте?

Опубликовано
В обоих случаях "доступ к внешним переменным" не имеет с замыканиями ничего общего. Можете пример привести, возможно я не контексте?

 

Java:

 

interface UnaryFunction {
    int func (int x);
}

class X {
  public UnaryFunction multiplier (final int x) {
    return new UnaryFunction () {
      public int func (int y) { return x*y; }
    };
  }  

  public static void main (String args[]) {
    System.out.println(multiplier(2).func(2));
  }
}

 

=

 

multiplier x = \y -> (x * y)
main = putStrLn $ show ((multiplier 2) 2)

 

=

 

или вообще по простому советскому

 

main = putStrLn $ show ((2*) 2)

 

потому что каррирование ;)

Опубликовано

Pascal or Delphi

procedure work(a: integer);
  functyon multyplay(b: integer): integer;
  begin
    multyplay := a * b;
  end;
begin
  writeln(multyplay(2));
end;

begin
  work(2);
end.

 

Опубликовано
Pascal or Delphi

 

Гораздо интереснее вот такой вариант:

 

procedure work(a: integer);
  type unary = function (x: integer): integer;

  function multiply (b: integer): integer;
  begin
    multiply := a * b;
  end;

  procedure use (f: unary);
  begin
    writeln(f(2));
  end;
  
begin
  use(multiply(2));
end;

begin
  work(2);
end.

 

Интересно скомпилируется или нет?

Изменено пользователем AmbassadorKosh

Опубликовано

Понял, спасибо, на этом примере в Джаве замыкания полностью поддерживаются, так как явно определяем тип.

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

 

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

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

 

 

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

 

нет, такого скорее всего не получится, именно поэтому я и назвал "недоподдержкой" ...

 

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

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

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

Аккаунт

Навигация

Поиск

Поиск

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.