Мова програмування d: функціональні типи і делегати

Відео: Уроки C #

Функціональні типи і делегати
Мова програмування D: функціональні типи і делегати

В С ++ передати функцію як параметр або зберегти її в масиві можна тільки за допомогою покажчика, а синтаксис покажчиків на функції в С ++ просто страхітливий. Щоб хоч якось полегшити життя в С ++ з`явилися boost :: function, boost :: bind і їм подібні рішення. У D проблема елегантно вирішується за допомогою змінних функціонального типу:
void do_sqr (int x) {writeln (x * x) -} // Сама функція
// Змінна функціонального типу
void function (int)
fun = do_sqr- fun (5) - // Виклик вихідної функції


До речі, на D зараз активно пишуться програми для мобільних ОС. І якщо Ви, встановивши один з них, перетворили свій новенький смартфон в "цегла", то ремонт iphone на виїзді (https://apple-e.ru/repair/iphone/) - це єдине і найдієвіший рішення вашої проблеми.

Крім того, в D легко працювати з парадигмою функціонального програмування. У цьому випадку функція є «ледачою» - вона не обчислює щось сама, а повертає іншу функцію, яка обчислює те, що потрібно. В С ++ «ліниві» обчислення здійснюються за допомогою «магічного» застосування шаблонів і виглядають дуже складно (показовий приклад - бібліотека boost :: phoenix2). У D всіх необхідних заходів вбудовані в мову. Як приклад створимо масив з 10 функцій. Перша додає до свого аргументу 1, друга - 2, і т.д.
import std.stdio;
T delegate (T) do_plus (T) (T p)



if (is (typeof (p == 1.0) == bool))
{
return delegate (T val) {return val + p-};
}
void main () {



auto functions = new int delegate (int) [10] - foreach (i-0..10) functions [i] = do_plus (i) - foreach (func-functions) writeln (func (100));
}

Функція do_plus - шаблонна, має два списки аргументів. Перший - перерахування шаблонних параметрів, а другий-власне аргументи. Відразу видно вигідне відміну синтаксису від С ++:
template
T func (T x) - // С ++ T func (T) (T x) - // D

Функція do_plus повертає делегата - анонімну функцію особливого типу. На відміну від лямбда-функції делегат «пам`ятає» контекст свого створення і може використовувати будь-які символи тієї функції, яка його «породила» (такі функції називають замиканнями). Ми, наприклад, додаємо аргумент функції-батька p до аргументу самого делегата val.

Мова програмування D: функціональні типи і делегати

У функції main ми створюємо масив з 10 делегатів і наповнюємо його в циклі так, що i-й делегат додає до свого аргументу i. Потім викликаємо в циклі всіх делегатів, передаючи їм число 100, і очікувано отримуємо на виході 100, 101, 102 ... 109.

обмеження сигнатур

Шаблонної функції можна передати аргумент будь-якого типу, але в прикладі ми хочемо працювати тільки з числами. Дивна конструкція if (is (typeof (p == 1.0) == bool)) називається обмеженням сигнатури шаблонної функції, викликається тільки на стадії компіляції і покликана відсіювати аргументи невідповідного типу.

Якщо вираз p == 1.0 осмислено (наприклад, для типів int або double), то typeof поверне bool, а оператор порівняння типів is поверне true і компілятор продовжить роботу. Однак для аргументу типу string порівняння p == 1.0 безглуздо, а його тип - «ніякої», т. Е. Bool. Оператор is поверне false і компілятор видасть помилку.

Обмеження сигнатури - дуже потужний механізм, який робить шаблонні функції «дуракоустойчівие». Наскільки мені відомо, він не має аналогів в інших мовах.

ІНШЕ

Seed7: бібліотеки фото

Seed7: бібліотеки

Відео: пентагональними призма з насіння льону. П`ятикутна призма. геометричні фігури.Стереометрія Якщо Сі або C ++ без…

Мова програмування vala фото

Мова програмування vala

Hello world! Розгляд будь-якої мови програмування традиційно належить починати з найпростішої програми «Hello…

Неясності з phonon фото

Неясності з phonon

Від труднощів збірки перейдемо до неясним місцях у використанні Phonon. Phonon підтримує ті мультимедійні формати, які…

Взаємодія chaiscript з c ++ фото

Взаємодія chaiscript з c ++

Відео: Jason Turner: Why and How To Add ScriptingІдеологія взаємодії ChaiScript і С ++ Скриптова мова ChaiScript…

» » Мова програмування d: функціональні типи і делегати