أي ما يعادل بيثون استمرارا مع روبي
-
10-07-2019 - |
سؤال
ما يعادل بيثون من التعليمة البرمجية التالية في روبي؟
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: الإستمرار المستندة إلى أطر
المحلول
وهذه المادة التي نقلت تحتوي على وصلة ل الإستمرار تقدم بسيط ومصورة في قسم الموارد، التي تتحدث عن استمرارا في لغة بايثون.
نصائح أخرى
ونلقي نظرة على العائد أ > بيان لجعل مولدات الكهرباء.
وأنا لا أتكلم أي روبي، ولكن يبدو أن كنت تبحث عن هذا:
def loop():
for i in xrange(1,5):
print i
if i == 2:
yield
for i in loop():
print "pass"
وتحرير: وأنا أدرك هذا هو في الأساس تخصص استمرارا حقيقية، ولكن يجب أن تكون كافية لمعظم الأغراض. استخدام yield
للعودة استمرار والرسالة .next()
على مولد (عاد فقط عن طريق الدعوة loop()
) لإعادة إدخال.
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()