سؤال

كيف يمكنني تمرير متغير بالرجوع في مخطط?

مثال على وظيفة أريد:

(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 هو منجم ذهبي لقراءات مثيرة للاهتمام، لذا تأكد من حجزه إذا لم يكن لديك بالفعل.

p> http://okmij.org/ftp/scheme/pointer-as-Closure.txt

يمكنك التأثير على سياق خارجي من داخل وظيفة محددة في هذا السياق الخارجي، مما يمنحك تأثير تمرير بالمتغير المرجعي، أي وظائف مع آثار جانبية.

giveacodicetagpre.

يحد هذا الحل من نطاق الآثار الجانبية.

خلاف ذلك هناك (حدد x (الإطار 5))، (UNBox X)، وما إلى ذلك كما هو مذكور في تقدم من إيلي، وهو نفس محلول سلبيات التي اقترحها Erjiang.

ربما تستخدم الكثير من C، PHP أو أيا كان. في مخطط لا تريد أن تفعل أشياء مثل Pass-by- *. فهم أولا ما يعني النطاق وكيف يتصرف التنفيذ المختلفة (لا سيما معرفة ما هو الفرق بين LISP ومخطط).

بحلول الجوهر لغة برمجة وظيفية بحتة لا تملك تأثير جانبي.وبالتالي فإن هذا يعني أن المرجع المبرر ليس مفهوما وظيفيا.

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