Неизменный объект - что-то, что можно безопасно принять, не собирается изменяться; это имеет важное свойство, что все использующие его могут предположить, что видят то же значение.
Неизменность обычно также означает, что можно думать об объекте, как являющемся "значением", и что нет никакого эффективного различия между идентичными копиями объекта и самого объекта.
Вот пример на C ++, который имитирует генераторы с использованием волокон:
Итератор возврата доходности для собственного C ++ с использованием волокон
Итератор "yield return" - это языковая функция, созданная для одна причина: простота. это как правило, намного проще повторять по всей коллекции, сохраняя все контекст, необходимый в локальных переменных, вместо того, чтобы создавать сложные, пользовательский объект итератора, который хранит свои состояние при последующем извлечении
Существуют также примитивные подпрограммы C setjmp, longjmp для достижения аналогичных результатов.
(Сопрограммы Lua реализованы с помощью вышеуказанного метода)
В JavaScript 1.7+ мне обычно достаточно добавить несколько скобок и скобок. В остальном все примерно так же. В JavaScript 1.7, помимо прочего, представлены питонические генераторы и итераторы.
# Python
(x + 1 for x in y if x > 100)
// JavaScript 1.8+
(x + 1 for (x in y) if (x > 100))
# Python
def simpleRange(n):
for i in xrange(n):
yield i
for n in simpleRange(5):
print(n)
// JavaScript 1.7+
function simpleRange(n) {
for (let i = 0; i < n; i++)
yield i;
}
for (n in simpleRange(5))
print(n);
# Python
[x + 1 for x in y if x > 100]
// JavaScript 1.7+
[x + 1 for (x in y) if (x > 100)]
Монады могут использоваться для представления генераторов (даже если семантика немного отличается).
Таким образом, здесь можно использовать любой язык, позволяющий определять монадические операции в рамках специального синтаксиса. .
yield return
) Ruby может эмулировать генераторы с помощью своих встроенных возможностей продолжения.
Common Lisp, хотя и не имеет собственных продолжений, позволяет создавать продолжения с разделителями, используя преобразователи CPS, такие как cl-cont . Таким образом, генераторы в Common Lisp могут быть написаны почти так же, как генераторы схем.
Между прочим, генераторы, основанные на продолжении, имеют одну особенность, которой не хватает генераторам Python и C #: yield
может быть вызван в динамическом экстенте вызова функции генератора. Генераторы Python и C # позволяют размещать yield
только внутри тела генератора.