|
|
سطر 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 في توثيق روبي الرسمي.] |