الفرق بين المراجعتين لصفحة: «Ruby/Continuation»

من موسوعة حسوب
أنشأ الصفحة ب'<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Continuation</code> في روبي}}</noinclude> تصنيف: Ruby تصنيف: Ruby Continuation يمكن تم...'
 
ط مراجعة وتدقيق
 
(3 مراجعات متوسطة بواسطة مستخدم واحد آخر غير معروضة)
سطر 1: سطر 1:
<noinclude>{{DISPLAYTITLE: صفحة الصنف <code>Continuation</code> في روبي}}</noinclude>
<noinclude>{{DISPLAYTITLE: الصنف <code>Continuation</code> في روبي}}</noinclude>
[[تصنيف: Ruby]]
[[تصنيف: Ruby]]
[[تصنيف: Ruby Class]]
[[تصنيف: 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> عبر <code>require</code>. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة <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)
</syntaxhighlight>
==الثوابت==
===[[Ruby/Complex/I|الثابت التخيلي <code>I</code>]]===
يمثل الثابت <code>i</code> العدد التخيلي للأعداد العقدية.
==توابع الصنف العامة (Public Class Methods)==
===[[Ruby/Complex/polar|التابع <code>polar</code>]]===
يعيد التابع ‎<code>polar</code> عددا عقديا وفق الشكل القطبي (polar form).
===[[Ruby/Complex/rect|التابع <code>rect</code>]]===
يعيد التابع ‎<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>]]
def f
  c, size = g
  c.call(c) if size > 1
end


يعيد التابع ‎<code>inspect</code> العدد العقدي على شكل سلسلة نصية لأجل التفتيش (inspection). 
f


[[Ruby/Complex/magnitude|التابع <code>magnitude</code>]]
</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


يعيد التابع ‎<code>magnitude</code> الجزء المطلق (absolute part) للشكل القطبي للعدد العقدي.
</syntaxhighlight>سينتج المثال السابق عند تنفيذ ما يلي:<syntaxhighlight lang="ruby">
===[[Ruby/Complex/numerator|التابع <code>‎numerator‎</code>]]===
0:  0  1  2  3  4
يعيد التابع ‎<code>numerator</code> مقام (numerator) العدد العقدي. 
1:  5  6  7  8  9
===[[Ruby/Complex/phase|التابع <code>phase</code>]]===
2:  10 11 12 13 14
 يعيد التابع ‎<code>phase</code> الجزء الزاوي (angle part) للشكل القطبي للعدد العقدي الذي استُدعي معه.
3:  15 16
===[[Ruby/Complex/quo|التابع <code>quo</code>]]===
</syntaxhighlight>
يؤدي التابع ‎<code>quo</code>عملية القسمة على الأعداد العقدية.
==توابع الصنف العامة (Public Class Methods)==
===[[Ruby/Complex/rationalize|التابع <code>rationalize</code>]]===
===[[Ruby/Continuation/cont|<code>cont</code>]]===
يعيد التابع ‎<code>rationalize</code> القيمة الجذرية (rational ) المقابلة للعدد العقدي. ينبغي أن يكون الجزء التخيلي معدوما. 
يستدعي العملية <code>continuation</code>. يستمر البرنامج من نهاية كتلة <code>callcc</code>.
 
===[[Ruby/Continuation/call|<code>call</code>]]===
[[Ruby/Complex/real|التابع <code>real</code>]]
يستدعي العملية <code>continuation</code>. يستمر البرنامج من نهاية كتلة <code>callcc</code>.  
 
==مصادر<span> </span>==
يعيد التابع ‎<code>real</code> الجزء الحقيقي (real part) للعدد العقدي.
*[http://ruby-doc.org/core-2.5.1/Continuation.html صفحة الصنف Continuation في توثيق روبي الرسمي.]
 
=== [[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>
*[http://ruby-doc.org/core-2.5.1/Complex.html قسم  الصنف Continuation في توثيق روبي الرسمي.]

المراجعة الحالية بتاريخ 21:19، 10 نوفمبر 2018

تُولّد الكائنات Continuation بواسطة التابع Kernel.callcc بعد استيراد continuation عبر require. تحمل هذه الكائنات عنوان العودة (return address) وسياق التنفيذ (execution context)، مما يتيح العودة إلى نهاية الكتلة 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)

cont

يستدعي العملية continuation. يستمر البرنامج من نهاية كتلة callcc.

call

يستدعي العملية continuation. يستمر البرنامج من نهاية كتلة callcc.  

مصادر