|
|
(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 في توثيق روبي الرسمي.] | |
تُولّد الكائنات 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/
ستُنتِج هذه الشيفرة عند تنفيذها:
ويمكن أيضًا استدعاء 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)
يستدعي العملية continuation
. يستمر البرنامج من نهاية كتلة callcc
.
يستدعي العملية continuation
. يستمر البرنامج من نهاية كتلة callcc
.
مصادر