سؤال

أنا أقرأ "On lisp" وواجهت هذا الرمز (لقد قمت بتبسيطه قليلاً).

CL-USER> (defun foo ()                                                          
           '(a b c))
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C D E) 
CL-USER> (defun foo ()                                                          
          (list 'a 'b 'c))
STYLE-WARNING: redefining FOO in DEFUN                                          
FOO                                                                             
CL-USER> (foo)
(A B C)                                                                         
CL-USER> (nconc * '(D E))
(A B C D E)                                                                     
CL-USER> (foo)
(A B C)
  • ماذا يفعل بالضبط * يقصد؟هل هو استدعاء الوظيفة السابقة؟هل هو مناسب للاستخدام في كود العالم الحقيقي؟

  • لماذا (nconc * '(D E)) تغيير قيمة الإرجاع للأول foo وظيفة؟

  • اعتقدت دائما (list 'a 'b 'c) و '(a b c) هي نفسها؟ماهو الفرق؟

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

المحلول

يؤدي استدعاء LIST إلى إنشاء قائمة جديدة في كل مرة يتم تقييمها.قد يتم وضع القائمة الحرفية في مقطع ذاكرة للقراءة فقط بعد التجميع.يعد التحديث المدمر للقوائم باستخدام NCNC مشكلة، ربما مع عواقب غير محددة (خطأ في التجزئة، أو تغيير الحرفي للمراجع المستقبلية، أو لا شيء على الإطلاق).

نصائح أخرى

المتغيرات *, ** و *** يتم تحديدها من قبل اللغة معيار وهي مفيدة جدًا عند اختبار الأشياء.إنها سمة من سمات REPL، وبالتالي فهي ليست، وليس من المفترض، أن تكون مفيدة في "كود العالم الحقيقي".

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