0

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

Например:

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(); // ?? 

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

  1. с == 2, д == 3 означает, что функция генератора совместно
  2. с == 0, d == 2 означает, что создается новая функция генератора со значениями, инициализированными
  3. c == 2, d == 2, что означает, что новая функция генератора создается путем копирования текущего состояния генератора

Лучший ответ, на мой взгляд, послужит самым убедительным аргументом для того, чтобы сделать тот или иной механизм. Часто я нахожу, что уровень техники является наиболее убедительным аргументом.

+2

И для бонусных очков, что о разных потоках? – leppie

+0

Различные темы - это самостоятельная проблема. Это также происходит, даже если вы не назначаете генераторы (предполагая, что потоки могут обращаться к тем же переменным). –

ответ

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) 
+0

Если редактирование для включения большого блока кода слишком много, я сожалею! Я хотел, чтобы он добавил, и почувствовал, что слишком мало для ответа. – u0b34a0f6ae

+0

Код выглядит правильно, поэтому редактирование в порядке (хотя я считаю, что установка f для связанного следующего метода слишком мила, я бы предпочел поделиться генератором, а не методом bound). –

Смежные вопросы