سؤال

ما يعادل بيثون من التعليمة البرمجية التالية في روبي؟

def loop
  cont=nil
  for i in 1..4
    puts i
    callcc {|continuation| cont=continuation} if i==2
  end
  return cont
end

> c=loop
1
2
3
4
> c.call
3
4

والمرجعي: أسرار نجاح التنمية خفيفة الوزن، الجزء 9: الإستمرار المستندة إلى أطر

هل كانت مفيدة؟

المحلول

وهذه المادة التي نقلت تحتوي على وصلة ل الإستمرار تقدم بسيط ومصورة في قسم الموارد، التي تتحدث عن استمرارا في لغة بايثون.

نصائح أخرى

generator_tools (ولتثبيت: "$ easy_install generator_tools" ):

from generator_tools import copy_generator

def _callg(generator, generator_copy=None):
    for _ in generator: # run to the end
        pass
    if generator_copy is not None:
        return lambda: _callg(copy_generator(generator_copy))

def loop(c):
    c.next() # advance to yield's expression
    return _callg(c, copy_generator(c))

if __name__ == '__main__':
    def loop_gen():
        i = 1
        while i <= 4:
            print i
            if i == 2:
                yield
            i += 1

    c = loop(loop_gen())
    print("c:", c)
    for _ in range(2):
        print("c():", c())

وإخراج:

1
2
3
4
('c:', <function <lambda> at 0x00A9AC70>)
3
4
('c():', None)
3
4
('c():', None)

وهناك العديد من الحلول الضعيفة التي تعمل في بعض الحالات الخاصة (انظر إجابات أخرى على هذا السؤال)، ولكن ليس هناك بناء لغة بيثون وهو ما يعادل callcc أو التي يمكن استخدامها لبناء شيء يعادل callcc.

وأنت قد ترغب في محاولة Stackless بيثون أو في greenlet بيثون التمديد، وكلاهما يوفر coroutines، والتي على أساسها كان من الممكن لبناء continutations طلقة واحدة، ولكن هذا لا يزال أضعف من callcc روبي (التي تنص على استمرارا كاملة).

def loop():    
    def f(i, cont=[None]):        
        for i in range(i, 5):
            print i
            if i == 2:
                cont[0] = lambda i=i+1: f(i)
        return cont[0]
    return f(1)

if __name__ == '__main__':
    c = loop()
    c()
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top