Search
Write a publication
Pull to refresh

Программная идиома, о которой вы никогда не слышали

Reading time2 min
Views1.2K
Original author: James Hague
Вот некоторые последовательности событий:

Достать грабли из сарая, сгрести листья во дворе, затем поставить грабли обратно в сарай.

Полететь в Сиэтл, посмотреть достопримечательности, затем полететь домой.

Вставить ключ в дверь, открыть её, затем достать ключ из двери.

Включить экран телефона, посмотреть время, затем отключить его.


Видите шаблон? Вы делаете что-то, потом делаете что-то другое, а потом аннулируете первое действие. Или, более точно, последний шаг является обратным первому. Если вы знаете об этом шаблоне, то увидите его повсюду. Взять кружку, отхлебнуть кофе, поставить кружку. То же самое повсеместно встречается и в коде.

Открыть файл, прочитать содержимое, закрыть файл.

Выделить блок памяти, использовать его для чего-то, освободить память.

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


Хотя это просто объяснить и привести примеры, но нелегко реализовать на практике. Нам нужна операция, которая выглядит как idiom(Function1, Function2), чтобы мы смогли написать вышеупомянутый пример «открыть файл...» как idiom(Open, Read). Сложность в том, что должен быть некий программный способ определить, что обратный элемент для «открытия» есть «закрытие». Существуют ли языки программирования, в которых для функций существует инверсия?

Удивительно, но есть: J. И эта идиома, о которой я говорю, встроена в виде функции J, которая называется under (под). То есть на русском языке, а не в лаконичном синтаксисе J, пример с открытием файла звучал бы как «читать под открытием» (read under open).

Одно из неочевидных применений under в J — вычисление модуля вектора. Здесь простой алгоритм: возвести в квадрат каждый член, сложить их, а потом извлечь квадратный корень из результата. Хмм… третий шаг является обратным для первого. Сложение под квадратом. Или, в реальном коде на J:

mag =: +/&.:*:

+/ — это сложение. Последовательность &, точки и двоеточия означает функцию under, а *: — это возведение в квадрат.

В некоторых других языках программирования есть своеобразные аналоги функции under. Например, в Ruby вы можете открыть файл с указанием необходимого действия над этим файлом, и тогда он сам закроется по окончании указанного действия.

File.open('file.txt', 'w') {|file| # открытие файла «file.txt» для записи («w» — write)
   file.puts 'Wrote some text.'
}
Tags:
Hubs:
Total votes 50: ↑22 and ↓28-6
Comments25

Articles