ناتج غير متوقع مع سلبيات ()
-
28-09-2019 - |
سؤال
أنا من خلفية حتمية ولكن في هذه الأيام أحاول يدي على lisp (LISP المشتركة)
أنا أقرا هنا حول cons
الذي - التي
(سلبيات X L):
بالنظر إلى كائن LISP X وقائمة L ، يقوم تقييم (Cons X L) بإنشاء قائمة تحتوي على X تليها العناصر في L.
عندما لم أستخدم قائمة عن قصد كوسيطة ثانية IE عندما استخدمت
(cons 'a 'a)
كنت أتوقع خطأ ولكن قف! أنا أخذت (A . A)
.
ماذا فاتني وماذا (A . A)
?
المحلول
Cons
يبني "خلية CONS". هذا لا علاقة له بالقوائم في البداية. خلية Cons هي زوج من قيمتين. يتم تمثيل خلية CONS في شكل مكتوب من قبل "زوج منقط" ، على سبيل المثال (A . B)
, الذي يحمل القيمتين 'A
و 'B
.
يسمى المكانان في خلية Cons "Car" و "CDR". يمكنك تصور مثل هذه الخلية Cons ككتلة مُصورة:
car cdr
+-----+-----+
| A | B |
+-----+-----+
في LISP ، يمكن أن تكون القيمة أيضًا إشارة إلى شيء آخر ، على سبيل المثال ، خلية CONS أخرى:
+-----+-----+ +-----+-----+
| A | --------> | B | C |
+-----+-----+ +-----+-----+
سيتم تمثيل هذا في شكل "زوج منقط" كما (A . (B . C))
. يمكنك الاستمرار مثل هذا:
+-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | D |
+-----+-----+ +-----+-----+ +-----+-----+
هذا هو (A . (B . (C . D)))
. كما ترون ، في مثل هذا الهيكل ، تكون القيم دائمًا في car
من خلية السلسلة ، و cdr
يشير إلى بقية الهيكل. الاستثناء هو القيمة الأخيرة ، وهي في النهاية cdr
. لا نحتاج إلى هذا الاستثناء ، على الرغم من ذلك: هناك قيمة خاصة NIL
في Lisp ، الذي يدل على "لا شيء". عن طريق وضع NIL
في آخر cdr
, ، لديك قيمة حارس مفيدة ، و الكل قيمك في car
س:
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
| A | --------> | B | --------> | C | --------> | D | NIL |
+-----+-----+ +-----+-----+ +-----+-----+ +-----+-----+
هذه هي الطريقة التي يتم بها بناء القائمة في Lisp. حيث (A . (B . (C . (D . NIL))))
هو غير عملي بعض الشيء ، ويمكن أيضًا تمثيله ببساطة (A B C D)
. NIL
يسمى أيضًا القائمة الفارغة ()
; ؛ هذه تدوينات قابلة للتبادل لنفس الشيء.
الآن يمكنك أن ترى لماذا (cons x list)
إرجاع قائمة أخرى. Cons
ببساطة يبني خلية سلبيات أخرى مع x
في ال car
والإشارة إلى list
في ال cdr
:
+-----+-----+
| X | --------> list
+-----+-----+
و إذا list
هو (A B)
, ، يعمل على النحو التالي:
+-----+-----+ +-----+-----+ +-----+-----+
| X | --------> | A | --------> | B | NIL |
+-----+-----+ +-----+-----+ +-----+-----+
لذا، (cons x '(a b))
يقيم (x a b)
.
القوائم ليست سوى استخدام شائع جدًا للخلايا السلبيات. يمكنك أيضًا إنشاء أشجار تعسفية من خلايا السلبيات ، أو القوائم الدائرية ، أو أي رسم بياني موجه ، في الواقع.
نصائح أخرى
'a
هي ذرة lisp و (A . A)
هي قائمة متدهورة تسمى أ CONS Cell أو "زوج منقط". بما أنك لم تمر بقائمة للسياسة L
في (cons x L)
لقد عدت خلية.
(سلبيات X L)
بالنظر إلى X و L ، تقوم Cons بإرجاع خلية Cons جديدة مع X كسيارة لتلك الخلية و L كـ CDR لتلك الخلية.
القوائم هي سلاسل ربط خلايا السلبيات.
CL-USER 141 > (sdraw '(a b c))
[*|*]--->[*|*]--->[*|*]---> NIL
| | |
v v v
A B C
CL-USER 142 > (sdraw (cons 'foo '(a b c)))
[*|*]--->[*|*]--->[*|*]--->[*|*]---> NIL
| | | |
v v v v
FOO A B C
إذا حصلت السلبيات على رمبين كوسيطة ، فإنها تبدو هكذا:
CL-USER 143 > (sdraw (cons 'foo 'bar))
[*|*]---> BAR
|
v
FOO