الفرق بين المراجعتين ل"Ruby/Continuation"

من موسوعة حسوب
اذهب إلى التنقل اذهب إلى البحث
(أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Continuation</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Continuation يمكن تم...')
 
سطر 2: سطر 2:
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby]]
 
[[تصنيف: Ruby Continuation]]
 
[[تصنيف: Ruby Continuation]]
يمكن تمثيل الأعداد العقدية (تُسمّى أيضًا أعدادًا مركبة) كزوج مكون من عدد حقيقي ووحدة تخلية (العدد <code>i</code>) ؛ وفق الشكل <code>a+bi</code>، حيث <code>a</code> هو الجزء الحقيقي، و <code>b</code> هو الجزء التخيلي و <code>i</code> هو الوحدة الخيالية.
+
تُولّد الكائنات من الصنف<code>Continuation</code> بواسطة التابع <code>Kernel#callcc</code>، بعد استيراد "<code>continuation</code>". يُعدّ التابع عنوان إعادة (return address)  وسياق تنفيذ (execution context)، مما يتيح إعادة غير محلية (nonlocal return) في نهاية الكتلة <code>callcc</code> من أي مكان في البرنامج.
  
العدد الحقيقي <code>a</code> يساوي رياضياتيًا العدد العقدي <code>a+0i</code>.
+
كائنات الصنف<code>Continuation</code> هي أقرب إلى نسخة من <code>setjmp/longjmp</code> في لغة C (على الرغم من أنها تحتوي على حالات أكثر، لذلك فيمكن اعتبارها أقرب إلى المهام الفرعية [threads])>.
  
يمكن إنشاء الأعداد العقدية بطريقة حرفية، وأيضا باستخدام التوابع <code>Kernel#Complex</code> أو  ‏‎<code>::rect</code> أو  ‏‎:<code>:polar</code> أو <code>‎#to_c.</code> إليك الأمثلة التالية:<syntaxhighlight lang="ruby">
+
على سبيل المثال:<syntaxhighlight lang="ruby">
2+1i                #=> (2+1i)
+
require "continuation"
Complex(1)          #=> (1+0i)
+
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
Complex(2, 3)        #=> (2+3i)
+
callcc{|cc| $cc = cc}
Complex.polar(2, 3)  #=> (-1.9799849932008908+0.2822400161197344i)
+
puts(message = arr.shift)
3.to_c              #=> (3+0i)
+
$cc.call unless message =~ /Max/
</syntaxhighlight>يمكنك أيضا إنشاء الكائنات العقدية من الأعداد من النوع  <code>float</code> أو من السلاسل النصية كما توضح الأمثلة التالية:<syntaxhighlight lang="ruby">
+
</syntaxhighlight>ستنتج:<syntaxhighlight lang="ruby">
Complex(0.3)        #=> (0.3+0i)
+
Freddie
Complex('0.3-0.5i')  #=> (0.3-0.5i)
+
Herbie
Complex('2/3+3/4i')  #=> ((2/3)+(3/4)*i)
+
Ron
Complex('1@2')      #=> (-0.4161468365471424+0.9092974268256817i)
+
Max
 +
</syntaxhighlight>ويمكن أيضًا استدعاء <code>callcc</code> في توابع أخرى:<syntaxhighlight lang="ruby">
 +
require "continuation"
  
0.3.to_c            #=> (0.3+0i)
+
def g
'0.3-0.5i'.to_c      #=> (0.3-0.5i)
+
  arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
'2/3+3/4i'.to_c      #=> ((2/3)+(3/4)*i)
+
  cc = callcc { |cc| cc }
'1@2'.to_c          #=> (-0.4161468365471424+0.9092974268256817i)
+
  puts arr.shift
</syntaxhighlight>تُصنّف الأعداد العقدية إلى مضبوطة (exact) و غير مضبوطة:<syntaxhighlight lang="ruby">
+
  return cc, arr.size
Complex(1, 1) / 2   #=> ((1/2)+(1/2)*i)
+
end
Complex(1, 1) / 2.0 #=> (0.5+0.5i)
+
 
 +
def f
 +
  c, size = g
 +
  c.call(c) if size > 1
 +
end
 +
 
 +
f
 +
 
 +
</syntaxhighlight>يسمح هذا المثال للحلقة الداخلية بالخروج مبكرًا:<syntaxhighlight lang="ruby">
 +
require "continuation"
 +
callcc {|cont|
 +
  for i in 0..4
 +
    print "\n#{i}: "
 +
    for j in i*5...(i+1)*5
 +
      cont.call() if j == 17
 +
      printf "%3d", j
 +
    end
 +
  end
 +
}
 +
puts
 +
 
 +
</syntaxhighlight>ستنتج:<syntaxhighlight lang="ruby">
 +
0:  0  1 2 3  4
 +
1:  5  6  7  8  9
 +
2:  10 11 12 13 14
 +
3: 15 16
 
</syntaxhighlight>
 
</syntaxhighlight>
==الثوابت==
 
===[[Ruby/Complex/I|الثابت التخيلي <code>I</code>]]===
 
يمثل الثابت <code>i</code> العدد التخيلي للأعداد العقدية.
 
 
==توابع الصنف العامة (Public Class Methods)==
 
==توابع الصنف العامة (Public Class Methods)==
 
===[[Ruby/Complex/polar|التابع <code>polar</code>]]===
 
===[[Ruby/Complex/polar|التابع <code>polar</code>]]===
سطر 34: سطر 58:
 
===[[Ruby/Complex/rect|التابع <code>rect</code>]]===
 
===[[Ruby/Complex/rect|التابع <code>rect</code>]]===
 
يعيد التابع ‎<code>rect</code> عددا عقديا وفق الشكل الجبري أو المستطيلي (rectangular form).
 
يعيد التابع ‎<code>rect</code> عددا عقديا وفق الشكل الجبري أو المستطيلي (rectangular form).
===[[Ruby/Complex/rectangular|التابع <code>rectangular </code>]]===
 
يعيد التابع ‎<code>rectangular</code> عددا عقديا وفق الشكل الجبري أو المستطيلي (rectangular form).
 
==توابع الكائن العامة (Public Instance Methods)==
 
===[[Ruby/Complex/star|المعامل <code>*</code>]]===
 
يؤدي المعامل ‎<code>*</code>عملية الضرب على الأعداد العقدية.
 
===[[Ruby/Complex/exp|المعامل <code>**</code>]]===
 
يؤدي المعامل ‎<code>**</code>عملية الأسّ (exponentiation) على الأعداد العقدية.
 
===[[Ruby/Complex/plus|المعامل <code>+</code>]]===
 
يؤدي المعامل ‎<code>+</code>عملية الجمع على الأعداد العقدية.
 
===[[Ruby/Complex/-|المعامل <code>-</code>]]===
 
يؤدي المعامل ‎<code>-</code>عملية الطرح على الأعداد العقدية.
 
===[[Ruby/Complex/negation|معامل النفي <code>-</code>]]===
 
يعيد معامل النفي ‎<code>-</code> نفي (مقابل) العدد العقدي. 
 
===[[Ruby/Complex/div|المعامل <code>/</code>]]===
 
يؤدي المعامل ‎<code>/</code>عملية القسمة على الأعداد العقدية.
 
===[[Ruby/Complex/equality operator|المعامل <code>==</code>]]===
 
يتحقق المعامل ‎<code>==</code>من تساوي عددين عقديين.
 
===[[Ruby/Complex/abs|التابع <code>abs</code>]]===
 
يعيد التابع ‎<code>abs</code> منظم (القيمة المطلقة) للعدد العقدي الذي استدعي معه.
 
===[[Ruby/Complex/abs2|التابع <code>abs2</code>]]===
 
يعيد  التابع ‎<code>abs2</code> مربع القيمة المطلقة للعدد العقدي الذي استدعي معه.
 
===[[Ruby/Complex/angle|التابع ‎<code>angle</code>]]===
 
يعيد  التابع ‎<code>angle</code> الجزء الزاوري (angle part) للشكل القطبي للعدد العقدي الذي استدعي معه.
 
===[[Ruby/Complex/arg|التابع <code>arg</code>]]===
 
يعيد التابع ‎<code>arg</code> منظم (arg  part) العدد العقدي الذي استدعي معه وفق الشكل القطبي.
 
===[[Ruby/Complex/arg|التابع <code>arg</code>]]===
 
يعيد التابع ‎<code>conj</code> مرافق العدد العقدي.
 
===[[Ruby/Complex/arg|التابع <code>conjugate</code>]]===
 
يعيد التابع ‎<code>conjugate</code> مرافق العدد العقدي. 
 
===[[Ruby/Complex/denominator|التابع <code>denominator</code>]]===
 
يعيد التابع ‎<code>denominator</code> قاسم (denominator) العدد العقدي، أي المضاعف المشترك الأصغر (lcm) للجزءين الحقيقي والتخيلي.
 
===[[Ruby/Complex/fdiv|التابع <code>fdiv</code>]]===
 
يقوم التابع ‎<code>fdiv</code> بعملية القسمة على العدد العقدي.
 
===[[Ruby/Complex/finite|التابع <code>finite?‎</code>]]===
 
يتحقق التابع ‎<code>finite?‎</code> مما إذا كانت القيمة المطلقة (absolute part) للشكل القطبي للعدد العقدي الذي استُدعي معه منتهيًا (finite). 
 
===[[Ruby/Complex/imag|التابع <code>imag</code>]]===
 
يعيد التابع ‎<code>imag</code> الجزء التخيلي للعدد العقدي. 
 
===[[Ruby/Complex/imaginary|التابع <code>imaginary</code>]]===
 
يعيد التابع ‎<code>imaginary</code> الجزء التخيلي (imaginary part) للعدد العقدي. 
 
===[[Ruby/Complex/infinite|التابع <code>‎infinite?‎</code>]]===
 
يعيد التابع ‎<code>infinite?‎</code> قيمة بحسب ما إذا كانت القيمة المطلقة (absolute part) للشكل القطبي للعدد العقدي منتهية أو غير منتهية (infinite).
 
 
[[Ruby/Complex/inspect|التابع <code>inspect</code>]]
 
 
يعيد التابع ‎<code>inspect</code> العدد العقدي على شكل سلسلة نصية لأجل التفتيش (inspection). 
 
 
[[Ruby/Complex/magnitude|التابع <code>magnitude</code>]]
 
 
يعيد التابع ‎<code>magnitude</code> الجزء المطلق (absolute part) للشكل القطبي للعدد العقدي.
 
===[[Ruby/Complex/numerator|التابع <code>‎numerator‎</code>]]===
 
يعيد التابع ‎<code>numerator</code> مقام (numerator) العدد العقدي. 
 
===[[Ruby/Complex/phase|التابع <code>phase</code>]]===
 
 يعيد التابع ‎<code>phase</code> الجزء الزاوي (angle part) للشكل القطبي للعدد العقدي الذي استُدعي معه.
 
===[[Ruby/Complex/quo|التابع <code>quo</code>]]===
 
يؤدي التابع ‎<code>quo</code>عملية القسمة على الأعداد العقدية.
 
===[[Ruby/Complex/rationalize|التابع <code>rationalize</code>]]===
 
يعيد التابع ‎<code>rationalize</code> القيمة الجذرية (rational ) المقابلة للعدد العقدي. ينبغي أن يكون الجزء التخيلي معدوما. 
 
 
[[Ruby/Complex/real|التابع <code>real</code>]]
 
 
يعيد التابع ‎<code>real</code> الجزء الحقيقي (real part) للعدد العقدي.
 
 
=== [[Ruby/Complex/real-3F|التابع <code>real?‎ </code>]] ===
 
يعيد التابع ‎<code>real?‎</code> القيمة <code>false</code> دائمًا. 
 
 
=== [[Ruby/Complex/to c|التابع <code>to_c</code>]] ===
 
يعيد التابع ‎<code>to_c</code> العدد العقدي نفسه. 
 
 
=== [[Ruby/Complex/to f|التابع <code>to_f</code>]] ===
 
يعيد التابع ‎<code>to_f</code> العدد العقدي الذي استدعي معه على شكل عدد من النوع <code>float</code> إن كان ذلك ممكنًا (ينبغي أن يساوي الجزء التخيلي العدد 0 تمامًا، وإلا فسيطلق الخطأ <code>RangeError</code>).
 
 
=== [[Ruby/Complex/to i|التابع <code>to_i</code>]] ===
 
يعيد التابع ‎<code>to_i</code> العدد العقدي الذي استدعي معه على شكل عدد صحيح من النوع <code>integer</code> إن كان ذلك ممكنًا (ينبغي أن يساوي الجزء التخيلي العدد 0 تمامًا، وإلا فسيطلق الخطأ <code>RangeError</code>).
 
 
=== [[Ruby/Complex/to s|التابع <code>to_s</code>]] ===
 
يعيد التابع ‎<code>to_s</code> العدد العقدي الذي استدعي معه على شكل سلسلة نصية.
 
===[[Ruby/Complex/to r|التابع <code>to_r</code>]]===
 
يعيد التابع ‎<code>to_r</code> القيمة الجذرية (rational ) المقابلة للعدد العقدي. ينبغي أن يكون الجزء التخيلي معدوما. 
 
 
==مصادر==
 
==مصادر==
 
<span> </span>
 
<span> </span>
*[http://ruby-doc.org/core-2.5.1/Complex.html قسم  الصنف Continuation في توثيق روبي الرسمي.]
+
*[http://ruby-doc.org/core-2.5.1/Continuation.html قسم  الصنف Continuation في توثيق روبي الرسمي.]

مراجعة 16:51، 15 سبتمبر 2018

تُولّد الكائنات من الصنفContinuation بواسطة التابع Kernel#callcc، بعد استيراد "continuation". يُعدّ التابع عنوان إعادة (return address) وسياق تنفيذ (execution context)، مما يتيح إعادة غير محلية (nonlocal return) في نهاية الكتلة callcc من أي مكان في البرنامج.

كائنات الصنفContinuation هي أقرب إلى نسخة من setjmp/longjmp في لغة C (على الرغم من أنها تحتوي على حالات أكثر، لذلك فيمكن اعتبارها أقرب إلى المهام الفرعية [threads])>.

على سبيل المثال:

require "continuation"
arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
callcc{|cc| $cc = cc}
puts(message = arr.shift)
$cc.call unless message =~ /Max/

ستنتج:

Freddie
Herbie
Ron
Max

ويمكن أيضًا استدعاء callcc في توابع أخرى:

require "continuation"

def g
  arr = [ "Freddie", "Herbie", "Ron", "Max", "Ringo" ]
  cc = callcc { |cc| cc }
  puts arr.shift
  return cc, arr.size
end

def f
  c, size = g
  c.call(c) if size > 1
end

f

يسمح هذا المثال للحلقة الداخلية بالخروج مبكرًا:

require "continuation"
callcc {|cont|
  for i in 0..4
    print "\n#{i}: "
    for j in i*5...(i+1)*5
      cont.call() if j == 17
      printf "%3d", j
    end
  end
}
puts

ستنتج:

0:   0  1  2  3  4
1:   5  6  7  8  9
2:  10 11 12 13 14
3:  15 16

توابع الصنف العامة (Public Class Methods)

التابع polar

يعيد التابع ‎polar عددا عقديا وفق الشكل القطبي (polar form).

التابع rect

يعيد التابع ‎rect عددا عقديا وفق الشكل الجبري أو المستطيلي (rectangular form).

مصادر