Генераторы Python на различных [закрытых] языках

Неизменный объект - что-то, что можно безопасно принять, не собирается изменяться; это имеет важное свойство, что все использующие его могут предположить, что видят то же значение.

Неизменность обычно также означает, что можно думать об объекте, как являющемся "значением", и что нет никакого эффективного различия между идентичными копиями объекта и самого объекта.

19
задан Vijay Mathew 20 September 2009 в 15:42
поделиться

4 ответа

Вот пример на C ++, который имитирует генераторы с использованием волокон:

Итератор возврата доходности для собственного C ++ с использованием волокон

Итератор "yield return" - это языковая функция, созданная для одна причина: простота. это как правило, намного проще повторять по всей коллекции, сохраняя все контекст, необходимый в локальных переменных, вместо того, чтобы создавать сложные, пользовательский объект итератора, который хранит свои состояние при последующем извлечении

Существуют также примитивные подпрограммы C setjmp, longjmp для достижения аналогичных результатов.
(Сопрограммы Lua реализованы с помощью вышеуказанного метода)

8
ответ дан 30 November 2019 в 03:59
поделиться

В 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)]
3
ответ дан 30 November 2019 в 03:59
поделиться

Монады могут использоваться для представления генераторов (даже если семантика немного отличается).

Таким образом, здесь можно использовать любой язык, позволяющий определять монадические операции в рамках специального синтаксиса. .

  • VB.NET/C# (Linq - но C # уже получил yield return )
  • Scala (Формальные представления)
  • Haskell (do-notation)
  • F # / OCaml ( Вычислительные выражения / Perform)

Ruby может эмулировать генераторы с помощью своих встроенных возможностей продолжения.

1
ответ дан 30 November 2019 в 03:59
поделиться

Common Lisp, хотя и не имеет собственных продолжений, позволяет создавать продолжения с разделителями, используя преобразователи CPS, такие как cl-cont . Таким образом, генераторы в Common Lisp могут быть написаны почти так же, как генераторы схем.

Между прочим, генераторы, основанные на продолжении, имеют одну особенность, которой не хватает генераторам Python и C #: yield может быть вызван в динамическом экстенте вызова функции генератора. Генераторы Python и C # позволяют размещать yield только внутри тела генератора.

1
ответ дан 30 November 2019 в 03:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: