اختلاف LISP بين (سلبيات 'A (سلبيات' ب 'ج)) و (سلبيات' (BC))

StackOverflow https://stackoverflow.com/questions/1859505

  •  13-09-2019
  •  | 
  •  

سؤال

ما الفرق بين:

(cons 'a (cons 'b 'c)) ;; (A B . C)

و

(cons 'a '(b.c)) ;; (A B.C)

أحتاج إلى إنشاء القائمة التالية ((AB) .c) باستخدام سلبيات لذلك أحاول فهم ما هذا "." يمثل.

جنيه: لدي ما يلي (cons (cons 'a 'b) 'c) لكنها تنتج ((A . B) . C) و لا ((A.B).C) (لاحظ المساحات الإضافية)

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

المحلول

تستخدم المساحات لفصل الرموز الرموز. A.B هو رمز واحد. (A.B) هي قائمة بعنصر واحد. (A . B) هي خلية سلبيات مع A كما سيارة و B كما CDR.

خلية سلبيات هي زوج من "الأشياء" (الكائنات). في حالتك، هذه الأشياء هي رموز، وسيتم تسميتها A, B, ، الخ. التمثيل المطبوع لهذه الخلية (A . B), ، علي سبيل المثال. وهذا ما يسمى "دوت تدوين". يسمى العنصر الأول "السيارة"، والثاني "CDR".

الوظيفة cons يخلق مثل هذه الخلية. (cons 'a 'b) هكذا تنتج الخلية (A . B). لاحظ أن الأسماء دائما ما يصل داخليا.

هذا على الأرجح ما يريده معلمك، لذلك ((A . B) . C) هو الإخراج الصحيح، والرمز الخاص بك الجواب الصحيح. هذه خلية حيث تشير السيارة إلى خلية أخرى، ويتضمن CDR C. وبعد أن الخلية الأخرى هي خلية حيث تحتوي السيارة A و CDR. B.

بالمناسبة، قائمة هي سلسلة خطية من خلايا هذه الخلايا، بحيث تتحمل السيارة دائما قيمة وتشير CDR إلى بقية القائمة. نقاط CDR الأخيرة في أي مكان (الذي يسمى Nil في LISP). في دوت تدوين، قائمة على سبيل المثال (A . (B . (C . NIL))). وبعد نظرا لأن القوائم مهمة، فيمكنك كتابة أقصر مثل هذا: (A B C). وبعد إذا كان لدى CDR الأخيرة قيمة بدلا من nil، فسيتم عرضها في تدوين النقطة، على سبيل المثال (A . (B . (C . D)))) يمكن كتابتها (A B C . D).

نصائح أخرى

. بين حرفين هو جزء من الرمز. b.c هو رمز باسم ثلاثة أحرف: ب, ., ، و جيم.

إذا قمت بالدخول FOO.BAR, ، ثم سيقرأ LISP كمزعم واحد.

إذا قمت بالدخول (FOO.BAR) ثم قراءتها LISP كقائمة مع رمز واحد كمحتوياتها.

إذا قمت بالدخول (FOO . BAR) ثم سيقرأ LISP كخلية سلبيات مع FOO كما السيارات و BAR كما CDR..

. يستخدم لفصل السيارات و ال CDR. من خلية سلبيات: (a . b). وبعد لاحظ الفضاء حولها ..

(cons 'b 'c) يخلق خلية سلبيات مع الرمز b كما السيارات والرمز c كما CDR.. وبعد هو مكتوب كما (b . c).

(cons 'a '(b.c)) يخلق قائمة من رمونتين، a و b.c. وبعد هو مكتوب كما (a b.c).

((A.B).C) هو دائما مطبوعة كما ((A.B) . C). وبعد انها ليست أيضا قائمة.

((a.b) . c) هي خلية سلبيات مع القائمة (a.b) كما السيارات والرمز c كما CDR..

إذا كان هذا في سياق تعلم LISP، فربما لم يقصد السؤال قاعدة ضمنية "لا توجد مساحة مسموح بها"، حيث أن المسافات ليست مهمة ضد الأقواس، والجابة الصحيحة هي التي قدمتها.

على وجه الخصوص، يتم دائما إضافة المساحة بعد قوس إغلاق، لكنها لغرض قابلية للقراءة البشرية فقط. لا معنى له أن تتطلب عدم طباعتها.

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