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