مخطط تمرير حسب المرجع
-
16-09-2020 - |
سؤال
كيف يمكنني تمرير متغير بالرجوع في مخطط?
مثال على وظيفة أريد:
(define foo
(lambda (&x)
(set! x 5)))
(define y 2)
(foo y)
(display y) ;outputs: 5
أيضا, هل هناك طريقة للعودة بالرجوع?
نصائح أخرى
كما قال جاري ، عادة ما تريد تجنب المرور بالإشارة في المخطط لأنه يشير إلى أنك تسيء استخدام الآثار الجانبية.
إذا كنت ترغب في ذلك ، يمكنك إرفاق أي شيء تريد تمريره بالرجوع إليه في cons
صندوق.
(cons 5 (void))
سوف تنتج مربع يحتوي على 5.إذا قمت بتمرير هذا المربع إلى إجراء يغير 5 إلى 6 ، فسيحتوي المربع الأصلي أيضا على 6.بالطبع ، عليك أن تتذكر cons
و car
عند الاقتضاء.
مخطط شي (وربما تطبيقات أخرى) لديه إجراء يسمى box
(ورفاقه box?
و unbox
) خصيصا لهذا الهراء الملاكمة / علبته: http://www.scheme.com/csug8/objects.html#./objects:s43
يمكنك استخدام ماكرو:
giveacodicetagpre.lambda!
giveacodicetagpre.jari هو الصحيح، إنه أمر غير محدد إلى حد ما بالرجوع إليه، على الأقل مع المتغيرات.ومع ذلك، يتم استخدام السلوك الذي تريده، وغالبا ما يشجع، طوال الوقت في مخطط أكثر من ذلك باستخدام الإغلاق. الصفحات 181 و182 كتب جوجل) في المخطط المحنك تفعل وظيفة أفضل، ثم يمكنني من شرحها.
هنا هو مرجع يمنح ماكرو يسمح لك باستخدام CORE EGE SYNTAX إلى "تمر بالرجوع إليه".موقع OLEGS هو منجم ذهبي لقراءات مثيرة للاهتمام، لذا تأكد من حجزه إذا لم يكن لديك بالفعل.
يمكنك التأثير على سياق خارجي من داخل وظيفة محددة في هذا السياق الخارجي، مما يمنحك تأثير تمرير بالمتغير المرجعي، أي وظائف مع آثار جانبية.
giveacodicetagpre.يحد هذا الحل من نطاق الآثار الجانبية.
خلاف ذلك هناك (حدد x (الإطار 5))، (UNBox X)، وما إلى ذلك كما هو مذكور في تقدم من إيلي، وهو نفس محلول سلبيات التي اقترحها Erjiang.
ربما تستخدم الكثير من C، PHP أو أيا كان. في مخطط لا تريد أن تفعل أشياء مثل Pass-by- *. فهم أولا ما يعني النطاق وكيف يتصرف التنفيذ المختلفة (لا سيما معرفة ما هو الفرق بين LISP ومخطط).
بحلول الجوهر لغة برمجة وظيفية بحتة لا تملك تأثير جانبي.وبالتالي فإن هذا يعني أن المرجع المبرر ليس مفهوما وظيفيا.