سؤال

لقد تحقق ويكيبيديا ، بحثت ولكن ما زلت لا استوعب كيف تمر-اسم يعمل في ALGOL 60.

هل كانت مفيدة؟

المحلول

ولقد وجدت تفسيرا جيدا على ممر-BY-اسم المعلمة فاة . في الأساس، يتم تفسير الجسم من وظيفة في وقت المكالمة بعد استبداله بالنص المعلمات الفعلية في الجسم وظيفة. وبهذا المعنى فإن طريقة تقييم مماثلة لتلك التي من وحدات الماكرو المعالج C.

حسب استبدال المعلمات الفعلية في الجسم وظيفة، وظيفة الجسم على حد سواء يمكن القراءة والكتابة المعلمات معين. وبهذا المعنى فإن طريقة التقييم هو مماثل لتمرير من قبل المرجعية. الفرق هو أنه منذ مع تمرير كل اسم المعلمة <م> تقييم داخل وظيفة، معلمة مثل a[i] يعتمد على القيمة الحالية للi داخل وظيفة، بدلا من الإشارة إلى القيمة في a[i] قبل تم استدعاء الدالة.

وصفحة أنا مرتبطة أعلاه لديه بعض الأمثلة أكثر من حيث تمرير كل اسم على حد سواء مفيد، وخطير. وحلت التقنيات التي أصبحت ممكنة بفضل اسم تمرير من قبل إلى حد كبير اليوم الأخرى، وتقنيات أكثر أمانا مثل تمرير كل إشارة وظائف امدا.

نصائح أخرى

وأفترض أنك تعني الكلمة من قبل اسم في ALGOL 60.

واتصل عن طريق اسم مشابه لدعوة من قبل المرجعية في أنه يمكنك تغيير قيمة مرت في المعلمة. وهو يختلف عن استدعاء كل إشارة في أن المعلمة هي <م> لا تقييمها قبل أن يتم استدعاء الإجراء ولكن بدلا من ذلك تقييم بتكاسل. وهذا هو، فإنه يتم تقييم عندما وفقط عندما يتم استخدام المعلمة في الواقع.

وعلى سبيل المثال، لنفترض أن لدينا f(x, y) الداخلي ونحن تمريرها i وi/2 حيث i تساوي في البداية إلى 10. إذا مجموعات f x إلى 42 ثم بتقييم y ذلك سوف نرى 21 قيمة (في حين مع دعوة المرجعية أو الاتصال من حيث القيمة انها لا تزال ترى 5). هذا هو لأنه لم يتم تقييم i/2 التعبير حتى يتم تقييم y.

في نواح كثيرة يبدو أن هذا التصرف مثل الحرفي النص استبدال المعلمات (مع إعادة تسمية لتجنب الصراعات الاسم). في الممارسة العملية، ولكن هذا يتم تنفيذ باستخدام "thunks" (عمليات الإغلاق أساسا) لتمريره في التعبيرات.

وهذه المادة ويكيبيديا على جهاز جنسن يظهر بعض الأمثلة المثيرة للاهتمام باستخدام دعوة بالاسم . هنا هو واحد منهم:

<اقتباس فقرة>
real procedure Sum(k, l, u, ak)
     value l, u;
     integer k, l, u;
     real ak;
     comment k and ak are passed by name;
 begin
     real s;
     s := 0;
     for k := l step 1 until u do
         s := s + ak;
     Sum := s
 end;
     

في الإجراء، وk مؤشر متغير ak والجمع المدى ل   مرت بالاسم. نداء بالاسم يتيح الإجراء لتغيير القيمة   المتغير المؤشر خلال تنفيذ للحلقة. اتصل بالاسم   يسبب أيضا حجة ak إلى أن إعادة تقييم خلال كل التكرار   الحلقة. عادة، سوف ak تعتمد على تغيير (الجانب تنفذ)   k.

     

وعلى سبيل المثال، رمز لحساب مجموع 100 حيث الأولى من الحقيقي   أن مجموعة V[] على النحو التالي:

Sum(i, 1, 100, V[i]).

بالنسبة لأولئك في المستقبل:

مفاهيم في البرمجة لغات جون C.كان ميتشل أيضا مفيدة.

تمر-اسم.ربما أغرب ميزة Algol 60 في وقت لاحق ، استخدام تمر-اسم.في تمر عن طريق الاسم, نتيجة استدعاء الإجراء هو نفسه كما لو معلمة رسمية تم استبداله في الجسم الداخلي.هذه القاعدة تحديد نتيجة الإجراء الاتصال عن طريق نسخ هذا الإجراء ، استبدال الرسمي المعلمات ويسمى Algol 60 نسخ القاعدة.على الرغم من أن نسخ حكم يعمل بشكل جيد نقية البرامج الوظيفية ، يتضح من β انخفاض في امدا حساب التفاضل والتكامل ، والتفاعل مع الجانب آثار الرسمي المعلمة هي غريبة بعض الشيء.هنا مثال برنامج عرض تقنية أشار كما جنسن الجهاز:تمرير والتعبير متغير يحتوي على أن الإجراء بحيث الإجراء يمكن استخدام معلمة واحدة لتغيير الموقع المشار إليه قبل الأخرى:


 begin integer i;
        integer procedure sum(i, j);
            integer i, j;
                comment parameters passed by name;
            begin integer sm; sm := 0;
                for i := 1 step 1 until 100 do sm := sm + j;
                sum := sm
            end;
        print(sum(i, i*10 ))
 end

في هذا البرنامج الإجراء مبلغ(i,j) يضيف قيم ي كما يذهب من 1 إلى 100.إذا نظرتم إلى رمز سوف ندرك أن الإجراء لا معنى له ما لم التغيرات لا تسبب بعض التغيير في قيمة ي ؛ وإلا فإن الإجراء فقط يحسب 100*ي.في الدعوة مبلغ(أنا*10) الموضحة هنا ، عن حلقة في الجسم الداخلي مبلغ يصل قيمة i*10 كما يذهب من 1 إلى 100.

والواقع، والدعوة تلو الاسم، وليس مجرد الفضول التاريخي. يمكنك أدعو من قبل اسم في ملفات دفعة ويندوز (وعدد لا يحصى من لغات البرمجة الأخرى). معرفة كيف يعمل، وكيفية استخدامها بشكل فعال في البرمجة يمكن أن تفتح حلول نظيفة للمشاكل. وأنا أعلم أنه هو فقط السلاسل التي تمر عبر للتوسع في وقت لاحق، ولكن يمكن التلاعب بها ليكون لها آثار مماثلة لاستدعاء كل اسم.

call :assign x 1
exit /b
:assign
setlocal enabledelayedexpansion
(endlocal
:: Argument 1 is the name of the variable
set %1=%2
)
exit /b

وFlatlander ديها مثال إلقاء الضوء على الكيفية التي تعمل في سكالا <لأ href = "http://hestia.typepad.com/flatlander/2009/01/scala-for-c-programmers-part-3-pass-by -name.html "يختلط =" نوفولو noreferrer "> هنا . افترض أنك تريد تنفيذ <م> أثناء :

<اقتباس فقرة>
def mywhile(condition: => Boolean)(body: => Unit): Unit =
  if (condition) {
    body
    mywhile(condition)(body)
  }
     

ويمكننا أن نسمي هذا كما يلي:

var i = 0
mywhile (i < 10) {
  println(i)
  i += 1
}

وسكالا ليس رأس الغول 60، ولكن ربما يلقي بعض الضوء.

ويمكنك تمرير "اسم" في شكل رمزي للمتغير الذي يسمح لها ليتم تحديثه والوصول إليها في وقت واحد على حد سواء. كما يتيح مثال لنفرض أنك تريد ثلاثة أضعاف في العاشر المتغير الذي هو من نوع int:

start double(x);
real x;
begin
x : = x * 3
end;

وصمم ALGOL لخوارزميات رياضية. أنا أحب وظيفة الجمع كمثال على دعوة بالاسم.

عذرا يا ALGOL قليلا صدئ بناء الجملة وربما ليس صحيحا.

.FUNCTION SUM(var,from,to,function)
.BEGIN
  .REAL sum =0;
  .FOR var = from .TO to .DO sum = function;
  return sum;
.END

هل يمكن من استخدام مبلغ مثل

  Y = sum(x,1,4,sum(y,3,8,x+y));

في ما سبق مجموع الداخلي (ذ، 3،8، س + ص) من شأنه أن يولد وظيفة لم يكشف عن اسمه لتمرير لنداء مبلغ الخارجي. لا يتم تمرير المتغيرات x و y من حيث القيمة ولكن بالاسم. في حالة المتغيرات استدعاء بالاسم ما يعادل استدعاء بالرجوع عنوان في C. فإنه يحصل مربكا بعض الشيء عندما يتعلق الأمر العودية.

ويستعير جعل آلات ALGOL. كان لديهم 48 الذاكرة كلمة بت مع 3 بت العلم. بت العلم نفذت كال بالاسم من ALGOL. كان الجهاز كومة ذلك عندما تم تحميل وظيفة إلى المكدس أن الدعوة بالاسم الفقير يسبب ذلك ليتم استدعاؤها. ان المترجم توليد وظائف لم يكشف عن اسمه عندما استخدمت تعبيرات كوسائط. ومن شأن متغير تكون اشارة غير مباشرة بسيطة. قد يحدث خطأ في الكتابة على وظيفة.

وأنا أعلم أنني الانضمام في وقت متأخر إلى النادي وهذا ليس بالضرورة جوابا، لكنني لم ترغب في إضافة شيء واحد يمكن أن تساعد في توضيح قليلا. لقد اعتقدت دائما من رأس الغول تمرير كل اسم عملية مماثلة لتوجيهات عندما المعالج في C ++ (وحدات الماكرو، على وجه التحديد) محل اسم بعض وظيفة / متغير مع قطعة الفعلي من التعليمات البرمجية أثناء وقت الترجمة. لتمرير كل اسم محل في الأساس اسم معلمة رسمية مع المعلمة الفعلية، وينفذ. لم يسبق لي ان كتبت في رأس الغول، ولكن أسمع أن هذا الاسم تمرير كل له نفس النتيجة كما تمر من قبل المرجعية C ++ الصورة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top