سؤال

أنا من خلفية حتمية ولكن في هذه الأيام أحاول يدي على 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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top