Что такое преднамеренное программирование

Что такое лямбда-функция?

Концепция лямбда-функции C ++ основана на исчислении лямбда и функциональном программировании. Лямбда - это неназванная функция, которая полезна (в реальном программировании, а не в теории) для коротких фрагментов кода, которые невозможно повторно использовать и не стоит именовать.

В C ++ функция лямбда определяется следующим образом

[]() { } // barebone lambda

или во всей его славе

[]() mutable -> T { } // T is the return type, still lacking throw()

[] - это список захвата, () список аргументов и {} тело функции.

Список захвата

Список захвата определяет, что из-за лямбда должно быть доступно внутри тела функции и как. Это может быть либо:

  1. значение: [x]
  2. ссылка [& amp; x]
  3. любая переменная, находящаяся в настоящее время в области по ссылке [ & amp;]
  4. то же, что и 3, но по значению [=]

Вы можете смешать любое из вышеперечисленного в списке с разделителями-запятыми [x, &y].

Список аргументов

Список аргументов тот же, что и в любой другой функции C ++.

Тело функции

Код, который будет выполняться, когда на самом деле вызывается лямбда.

Вывод типа возврата

Если лямбда имеет только один оператор return, возвращаемый тип может быть опущен и имеет неявный тип decltype(return_statement).

Mutable

Если лямбда отмечена как изменяемая (например, []() mutable { }), она разрешено изменять значения, которые были записаны по значению.

Случаи использования

Библиотека, определенная стандартом ISO, в значительной степени зависит от лямбда и повышает удобство использования нескольких баров, так как теперь пользователи

C ++ 14

В C ++ 14 lambdas были расширены различными предложениями.

Инициализированные лямбда-захваты

Элемент списка захвата теперь можно инициализировать с помощью =. Это позволяет переименовывать переменные и захватывать, перемещаясь. Пример, взятый из стандарта:

int x = 4;
auto y = [&r = x, x = x+1]()->int {
            r += 2;
            return x+2;
         }();  // Updates ::x to 6, and initializes y to 7.

и один из Википедии, показывающий, как захватить с помощью std::move:

auto ptr = std::make_unique<int>(10); // See below for std::make_unique
auto lambda = [ptr = std::move(ptr)] {return *ptr;};

Generic Lambdas

Теперь Lambdas может быть общим (auto был бы эквивалентен T здесь, если T был аргументом шаблона типа где-то в окружающей области):

auto lambda = [](auto x, auto y) {return x + y;};

Улучшенная вычитание возвращаемого типа

C ++ 14 позволяет выводить возвращаемые типы для каждой функции и не ограничивает ее функциями return expression;. Это также распространяется на лямбда.

16
задан Varun Mahajan 14 October 2008 в 14:28
поделиться

5 ответов

Вы запустили меня на этом...
Похож на C. Simonyi хотел ступить в следующий уровень абстракции с Высокоуровневых языков. Уменьшите зависимость клиентов на разработчиках для внесения каждого изменения.. в коде (загадочный для людей не в разработке). Таким образом, он изобретает этот новый продукт, названный IP, который имеет редактор GUI типа WYSIWYG для создания зависящей от домена модели. (т.е. IP имеет GUI для создания стандартных блоков для приложения.. LISP позволил Вам создавать meta/building блоки, но не способом, что специалисты по проблемной области могли легко сделать это.)
Как модели в UML, обещание состоит в том, что Вы можете автоматически генерировать соответствующий исходный код при "нажатии кнопки". Таким образом, специалисты по проблемной области могут настроить модель в будущем и нажать кнопку Bake для обеспечения следующей версии приложения. Это, кажется, использует DSLs однако с дополнительным преимуществом, что многопользовательски созданный DSLs может говорить друг с другом с помощью встроенного механизма IP..., что означает финансовую модель, и модель продаж может взаимодействовать и блоки повторного использования по мере необходимости. Как с DSLs, Вы извлекаете пользу из кода, который передает намерение разработчика, а не успокаивает ограничения языка реализации.

идея быть для давания большего контроля к BA и специалистам по проблемной области, которые на самом деле знают то, что необходимо...

Обновление : использование Реального мира 'еще' не похоже.. хотя Simonyi верит' абсолютно в долгосрочной перспективе '.
Рассказ : MS хлюпал IP в пользу.Net платформы, Simonyi, покинутый MS, и сформировал его собственную компанию' Intentional Software '.. с контрактом, что он мог использовать идеи IP, но он должен будет переписать свою работу, первичную с нуля.. (который должен замедлить его). Это является все еще происходящим Работой, я думаю.. и быть записанным в C# (для начальной загрузки)

Источники:

Для размышления до вчера.. Я не знал вещь об этом. Проводящий расследование журналист, заканчивающий. Возвращение к дневному заданию:)

10
ответ дан display name 14 October 2008 в 14:28
поделиться

Это - противоположность того, что происходит, когда я прихожу домой в 2:00 после похода по пабам и включаю ноутбук" только для проверения моей электронной почты, реальной быстрый, почтенный "

Затем на следующий день, когда я очищаю открытый один глаз и нахожу свой путь к ванной в трещине полудня , я начинаю чистить зубы и понимаю, зубная паста, сочащаяся из моего рта, что вчера вечером я сделал 4 фиксации SVN, закрыл 3 ошибки и выяснил, как решить проблему исчерпания ресурсов на нашем распределенном протоколе блокировки. И я имею никакая идея как, черт возьми, любой из него работы, больше.

Или возможно это что сказанный workmad3.

6
ответ дан SquareCog 14 October 2008 в 14:28
поделиться

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

Это явно упоминает LISP как язык, который поддерживает это, таким образом, я предположил бы, что Вы читаете на этом большом языке:) Макросы LISP точно, что описано в статье, позволив Вам неограниченно долго развернуть язык для покрытия почти чего-либо, что Вы хотели бы выразить. (Довольно общий результат больших систем LISP - то, что Вы заканчиваете с предметно-ориентированным языком, который очень хорош для записи определенных приложений, т.е. записи, что текстовой процессор заканчивается с текстовым процессором определенный язык).

Для Вашей последней части, да LISP (и таким образом Намеренное Программирование) используется в некоторых проектах. Paul Graham является великим сторонником LISP, и другие примеры его включают исходного Бандикута Катастрофического отказа (игровая система создания объекта была создана в LISP для этого, включая компилятор PlayStation LISP)

4
ответ дан workmad3 14 October 2008 в 14:28
поделиться

Кажется мне как еще один популярный товар разработки программного обеспечения. Мы уже видели тысячи из них: метапрограммирование, порождающее программирование, визуальное программирование, и так далее. В течение короткого времени они становятся очень модными, люди используют его везде, и затем они неизменно возвращаются к старым способам создать программное обеспечение.

, Почему? Frederick Brooks уже ответил на этот вопрос более чем 20 лет назад: существует Никакая Единственная Серебряная пуля для уничтожения оборотня...

3
ответ дан masterxilo 14 October 2008 в 14:28
поделиться

Это - где Вы намереваетесь программировать, Вы не просто случайно делаете это.;)

0
ответ дан Paul Nathan 14 October 2008 в 14:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: