Что должно произойти, когда назначена функция генератора? [закрыто]

StackOverflow https://stackoverflow.com/questions/1618829

Вопрос

Если у меня есть язык программирования с функциями первого класса. Какой должна быть семантика, когда функция генератора является общей?

Например:

var f = function() { 
  foreach (i in 0..42)
     yield i;
}

int a = f(); // 0
int b = f(); // 1

// Assigning the generator function 
var g = f;

int c = g(); // ??
int d = f(); // ??

Я могу представить три вещи:

<Ол>
  • c == 2, d == 3 означает, что функция генератора является общей
  • c == 0, d == 2 означает, что создана новая генераторная функция с инициализированными значениями
  • c == 2, d == 2 означает, что новая функция генератора создается путем копирования текущего состояния генератора
  • На мой взгляд, лучший ответ - самый убедительный аргумент в пользу того или иного механизма. Часто я считаю, что уровень техники является наиболее убедительным аргументом.

    Это было полезно?

    Решение

    Если у вас есть ссылочная семантика на вашем языке, и назначение обычно является ссылочным назначением, тогда вам нужен вариант 1.

    Это то, что происходит в Python, где генерируются объекты , а присвоение является ссылочным присваиванием (даже если вы вызываете .next () для получения следующего значения, скорее чем "вызов" генератора).

    Вот краткая демонстрация того, как это ведет себя в Python:

    >>> def gen():
    ...   for i in range(42):
    ...     yield i
    ... 
    >>> f = gen().next
    >>> a = f()
    >>> b = f()
    >>> g = f
    >>> c = g()
    >>> d = f()
    >>> a, b, c, d
    (0, 1, 2, 3)
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top