سؤال

وأنا أتعلم مخطط R5RS في هذه اللحظة (من PocketScheme) وأجد أن أتمكن من استخدام دالة المضمن في بعض أنواع من برنامج ولكن ليس كل شيء:! إلحاق

في بعبارة أخرى - تغيير المدمر قائمة

وأنا لست الكثير من المهتمين في الرمز الفعلي كإجابة بقدر فهم العملية التي يمكن للمرء أن تمرير القائمة بوصفها وظيفة (أو ناقل أو سلسلة) وبعد ذلك يتحول ذلك.

وعلى سبيل المثال:

(define (append! lst var)
    (cons (lst var))
)

عند يمكنني استخدام النهج على النحو الوارد أعلاه، أود أن تفعل شيئا مثل (define list (append! foo (bar)) التي أود شيء أكثر عمومية.

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

المحلول

والطفرة، على الرغم من المسموح به، يوصي بشدة في مخطط. PLT، بل ذهب أبعد من ذلك لإزالة set-car! وset-cdr! (على الرغم من أنها "محل" لهم set-mcar! وset-mcdr!). ومع ذلك، فإن المواصفات لappend! ظهرت في <لأ href = "http://srfi.schemers.org/srfi-1/srfi-1.html#append!" يختلط = "نوفولو noreferrer"> SRFI-1 . هذا append! يختلف قليلا من يدكم. في SRFI، وتنفيذ <م> قد ، ولكن لا <م> مطلوب لتعديل الخلايا سلبيات لإلحاق القوائم.

إذا كنت تريد أن يكون لها append! هذا هو مضمونة لتغيير بنية القائمة التي يجري إلحاقها، ربما عليك أن تكتب بنفسك. انها ليست الثابت:

(define (my-append! a b)
  (if (null? (cdr a))
      (set-cdr! a b)
      (my-append! (cdr a) b)))

لإبقاء تعريف بسيط، ليس هناك خطأ التحقق من هنا، ولكن من الواضح أنك سوف تحتاج إلى تمرير في قائمة طول 1 على الأقل a، و (يفضل) قائمة (أي طول) كما b. يجب أن يكون السبب a على الأقل طول 1 لأنك لا يمكن set-cdr! على قائمة فارغة.

ومنذ كنت مهتما في كيفية حدوث ذلك، سوف نرى ما اذا كان يمكنني أن أشرح. أساسا، ما نريد القيام به هو السير في a القائمة حتى نصل الى الزوج cons الماضي، وهو (<last element> . null). لذلك نرى أولا إذا a هو بالفعل العنصر الأخير في القائمة عن طريق التحقق من null في cdr. إذا كان، ونحن نستخدم set-cdr! لتعيينها إلى قائمة أننا إلحاق، وننتهي. إذا لم يكن كذلك، علينا أن ندعو my-append! على cdr من a. في كل مرة نفعل ذلك نحن نقترب من نهاية a. لأن هذا هو عملية التحول، ونحن لن يعود أي شيء، لذلك نحن لا داعي للقلق بشأن تشكيل قائمتنا تعديل كقيمة الإرجاع.

نصائح أخرى

ومتأخرا أفضل من ألا تأتي أبدا للوضع في بضع 2-3 سنتا في هذا الموضوع ...

و(1) لا يوجد شيء خاطئ مع استخدام الإجراءات المدمرة في مخطط <م> أثناء هناك مرجعية واحدة إلى stucture يتم تعديلها. هكذا على سبيل المثال، وبناء قائمة كبيرة من الكفاءة، مجزأة عبر إشارة واحدة - وعند اكتماله، مما يجعل ذلك (الآن يفترض أن لا ليكون معدلة) القائمة المعروفة والمشار إليها من مختلف المرجعيات

.

و(2) وأعتقد APPEND! يجب أن تتصرف مثل APPEND، فقط (يحتمل) المدمر. وهكذا APPEND! يجب أن نتوقع أي عدد من القوائم كوسائط. كل قائمة ولكن الماضي ومن المفترض أن يتم تعيين مجلس الإنماء والإعمار! "د إلى أخرى.

و(3) التعريف المذكور أعلاه من APPEND! هو أساسا NCONC من ماك اللثغة واللثغة المشتركة. (واللثغ أخرى).

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