имя для функции, которая преобразует операторы присваивания в выражения - PullRequest
1 голос
/ 24 июня 2010

обновление

Поскольку одним из эффектов этих функций является предоставление способа использования цепочки методов для методов, которые обычно не поддерживают его *, я подумываю назвать их chain и copychain соответственно. Хотя это кажется далеко не идеальным, поскольку предполагаемое copychain, возможно, является более фундаментальной концепцией, по крайней мере, с точки зрения функционального программирования.


оригинал

Я сейчас называю это boxer. Код написан на Python, хотя вопрос общий:

def boxer(f):
    """Return a function g(o, *args, **keyargs) -> o

    `g` calls `f` on `o` with the remaining arguments
        and returns `o`.

    >>> l = [2]
    >>> def increment_list_element(l, i):
    ...     l[0] += i
    >>> adder = boxer(increment_list_element)
    >>> adder(l, 2)
    [4]
    >>> def multiply_list_element(l, i):
    ...     l[0] *= i
    >>> multiplier = boxer(multiply_list_element)
    >>> sum(multiplier(l, 6))
    24
    """
    def box(o, *args, **keyargs):
        f(o, *args, **keyargs)
        return o
    return box

Аналогичная концепция копирует потенциального правопреемника, присваивает и возвращает копию. Это "shadow_boxer":

from copy import deepcopy

def shadow_boxer(f):
    """Return a function g(o, *args, **keyargs) -> p

    `g` deepcopies `o` as `p`,
        executes `f` on `p` with the remaining arguments,
        and returns `p`.

    >>> l = [2]
    >>> def increment_list_element(l, i):
    ...     l[0] += i
    >>> adder = shadow_boxer(increment_list_element)
    >>> adder(l, 2)
    [4]
    >>> def multiply_list_element(l, i):
    ...     l[0] *= i
    >>> multiplier = shadow_boxer(multiply_list_element)
    >>> sum(multiplier(l, 6))
    12
    """
    def shadow_box(o, *args, **keyargs):
        p = deepcopy(o)
        f(p, *args, **keyargs)
        return p
    return shadow_box

Кроме того, я хотел бы узнать о ресурсах для получения дополнительной информации о подобных вещах, хотя я точно так же не уверен в названии «такого рода вещей». Похоже, это связано с функциональным программированием, хотя, насколько я понимаю, в истинном функциональном языке эти методы не нужны.

Ответы [ 2 ]

2 голосов
/ 09 октября 2010

Это почти то же самое, что и Ruby Object#tap. Не знаю, как вы относитесь к этому имени, но так его называют.

0 голосов
/ 24 июня 2010

То, что возвращает функция boxer, вероятно, является определенным закрытием в некоторых языках программирования.Если функции с таким именем еще нет, я бы вызвал функцию closure.

...