Простое, но далеко достижение следствия возможности гнездо в функциях гнезда заключается в том, что данные могут храниться в прилагаемом объеме – или закрытии – внутренней функции. Рассмотрим следующую функцию:
def make_node(value, next_node): return lambda func: func(value, next_node)
Когда make_node
называется двумя аргументами, они прикреплены к закрытию возвращенной функции. Впоследствии мы можем получить доступ к двум аргументам через
def value(node): return node(lambda value, next_node: value)
а также
def next_node(node): return node(lambda value, next_node: next_node)
Например,
>>> node = make_node("head", "tail") >>> value(node) 'head' >>> next_node(node) 'tail'
С этими функциями в руке легко реализовать стек в виде связанного списка. Мы определяем обычные операции стека
def push(value, stack): return make_node(value, stack)
а также
def pop(stack): return value(stack), next_node(stack)
Поведение, как и ожидалось:
>>> stack = None >>> stack = push(1, stack) >>> stack = push(2, stack) >>> stack = push(3, stack) >>> val, stack = pop(stack) >>> val 3 >>> val, stack = pop(stack) >>> val 2 >>> val, stack = pop(stack) >>> val 1
Примечательно, что этот стек не использует встроенный встроенную структуру данных, такую как массив, а также не создает связанный список путем создания объектов узла. Скорее, существует цепочка функций, в которой закрытие каждой функции содержит значение и ссылку на следующую функцию.
Эта дискуссия была вдохновлена классическим Структура и интерпретация компьютерных программ . В частности, раздел 2.1 вводит понятие использования закрытий для создания структур данных.
Оригинал: “https://dev.to/scotchka/building-a-data-structure-with-nothing-but-functions-1i2p”