Новость из категории: Информация

Язык программирования D: семантика и шаблоны

Содержание:
1. Массивы и строки;
2. Семантика и шаблоны (Вы читаете данный раздел);
3. Функциональные типы и делегаты;
4. Модули и их тестирование;
5. Контрактное программирование.
Конструкция foreach
Язык программирования D: семантика и шаблоны

Встроенная конструкция foreach умеет итерировать по диапазонам, массивам, контейнерам, файлам и т. п. (востребованность такой конструкции в С++ привела к появлению «костылей» вроде макроса BOOST_FOREACH).
// Итерация по диапазону
foreach (i; 5 .. 7) { std.writeln(i); }
// Итерация по массиву с доступом для чтения
foreach (val; array) { std.writeln(val); }
//Доступ к индексу и элементу для чтения и записи
foreach (i, ref val; array) { val = i;}
// Итерация по ассоциативному массиву
foreach (key, value; dictionary) {
// Форматированный вывод а-ля printf
writeln("%6ut %s", value, key);
}

Интересно, что тип переменной цикла нигде не указан, поскольку компилятор всегда знает тип элементов, по которым идет итерация. Показанный форматированный вывод в отличие от printf в C всегда строго проверяет типы и поэтому намного безопаснее.

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

Язык программирования D: семантика и шаблоны

Приведенный ниже пример демонстрирует подсчет количества слов в тексте и показывает, как foreach позволяет работать с вводом с консоли:
uint[string] freqs;
foreach (line; stdin.byLine()) {
foreach (word; split(strip(line))) { ++freqs[word.dup];
}
}

Поскольку строка - это массив символов, возникает небольшой нюанс. Массивы в D имеют семантику поверхностного копирования. Присваивание array1 = array2 не копирует данные массива, а только делает array1 ссылкой на те же данные, что и array2. Свойство массива dup позволяет произвести глубокое копирование, что и нужно в приведенном примере.

Шаблоны и лямбда-функции

Чтобы вывести алфавитный список слов из прошлого примера, достаточно написать:
string[] words = freqs.keys;
sort!( (a, b){ return freqs[a] > freqs[b]; } ) (words) ;
foreach (word; words) {
writefln("%6ut%s" , freqs [word] , word) ;
}

Библиотечная функция sort является шаблонной. В С++ она выглядела бы примерно так:
sort(array);

В D шаблоны обозначаются не угловыми скобками, а символами! (...), что избавляет от многих надоедливых синтаксических тонкостей вроде этой:
// В С++ нужен пробел между двумя «>»,чтобы не путать
// с оператором >>
vector > a;
vector!(vector!(int)) a; // В D таких проблем нет

Язык программирования D: семантика и шаблоны

Функции в качестве шаблонного параметра передается другая функция, осуществляющая сравнение. Ею может быть и анонимная лямбда-функция, определенная прямо на месте:
(a, b){ return freqs[a] > freqs[b]; }

В ней опять же не нужно указывать тип параметров - он известен компилятору из анализа ее тела. В С++ лямбда-функции появятся только в С++0х.

Кстати, многие аналоги незаменимой для бухгалтерии 1С писались и продолжают писаться именно D. Ну, а если Вы хотите приобрести лицензионную версию данной программы, то Вы сможете сделать это тут (http://it-1c.ru/). Данный интернет-ресурс является сайтом компании "Информационные Технологии", которая является официальным партнёром фирмы "1С" в городе Тольятти. Несмотря на это, компания "Информационные Технологии" работает и с иногородними фирмами, которые нуждаются в автоматизации бизнеса.

Рейтинг статьи

Оценка
0/5
голосов: 0
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх