"D"iving Into the D Programming Language / Погружение в язык Ди: 1.4.3 Counting Frequencies. Lambda Functions
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
Давайте напишем ещё одну полезную программу, подсчитывающую число уникальных слов в тексте. Хотите узнать самые используемые слова в "Гамлете"? Вы в правильном месте! thornik 04.03.18 в 17:05 |
|
|
Эта программа использует ассоциативный массив, отображая строки на uint и имеет такую же структуру, как и построитель словаря. Закончим программу, добавив простой цикл печати: thornik 04.03.18 в 17:07 |
||
|
import std.stdio, std.string; thornik 04.03.18 в 17:07 |
||
|
Отлично! Теперь, скачав hamlet.txt из сети (http: //erdani.com/tdpl/hamlet.txt), протестируем программу: thornik 04.03.18 в 17:09 |
||
|
1 outface thornik 04.03.18 в 17:09 |
||
|
Грустно, но этот вывод бесполезен - слова не отсортированы по частоте. Конечно, мы можем поступить проще - пропустить вывод через "sort -nr" (отсортировать числа в обратном порядке), но это хитрый трюк. Напишем сами сортировку, заменив последний цикл этим кодом: thornik 04.03.18 в 17:12 |
||
|
// Print counts thornik 04.03.18 в 17:12 |
||
|
Свойство .keys возвращает только ключи ассоциативного массива как массив строк. Массив создаётся отдельно в памяти, а нам это и нужно, ведь мы будем переставлять строки. Осталось разобрать код: thornik 04.03.18 в 17:15 |
||
|
sort!((a, b) { return freqs[a] > freqs[b]; })(words); thornik 04.03.18 в 17:15 |
||
|
Мы сразу же узнали шаблон, рассмотренный ранее: thornik 04.03.18 в 17:15 |
||
|
sort!(<аргументы-времени-компиляции>)(<аргументы-времени-исполнения>); thornik 04.03.18 в 17:15 |
||
|
Мы видим, что аргумент времени компиляции выглядит как недописанная функция, где забыли указать все типы и имя самой функции: thornik 04.03.18 в 17:32 |
||
|
(a, b) { return freqs[a] > freqs[b] ; } thornik 04.03.18 в 17:33 |
||
|
Это "лямбда" - короткая, безымянная функция, предназначение которой - передаваться в другие функции. Лямбды настолько часто применимы, что в Ди сделали всё возможное, чтобы избежать ненужного синтаксического мусора при её описании: типы параметров и возврата выводятся сами, не создавая неоднозначностей. thornik 04.03.18 в 17:37 |
||
|
В этом примере стоит упомянуть ещё одну деталь, связанную с лямбдами: хотя переменная freqs - локальная для main, мы можем спокойно на неё ссылаться прямо из лямбды. thornik 04.03.18 в 17:41 |
||
|
929 the thornik 04.03.18 в 17:41 |
||
|
Как и ожидалось, наиболее общеупотребительные слова оказались первыми, за исключением "Ham" ("ветчина", прим.пер.). Это не говорит о кулинарных предпочтениях драмматического персонажа - это префикс всех цитат Гамлета. Кстати, их у него 358 штук - больше, чем у всех остальных. Если посмотреть далее, то следующий персонаж - король со всего лишь 116 строками. Офелия с её 58 цитатами вообще "молчунья"! thornik 04.03.18 в 17:50 |
