ما الفرق بين '(أ ب ج) و(القائمة 'أ 'ب' ج)؟
-
07-07-2019 - |
سؤال
أنا أقرأ "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، وبالتالي فهي ليست، وليس من المفترض، أن تكون مفيدة في "كود العالم الحقيقي".