سلبيات اللثغة الشائعة تنشئ قائمة من رمزين,سلبيات كلوجور تتطلب ما يليها سلبيات?
-
13-09-2020 - |
سؤال
(تنويه-أنا على بينة من أهمية سيكس في كلوجور)
في اللثغة المشتركة ، يمكن استخدام وظيفة السلبيات لدمج رمزين في قائمة:
(def s 'x)
(def l 'y)
(cons s l)
في كلوجور - يمكنك فقط سلبيات على تسلسل-لم يتم تمديد سلبيات للعمل مع اثنين من الرموز.لذلك عليك أن تكتب:
(def s 'x)
(def l 'y)
(cons s '(l))
هل هناك نمط مستوى أعلى في كلوجور يفسر هذا الاختلاف بين اللثغة الشائعة والكلوجور?
المحلول
في كلوجور ، على عكس ليسبس التقليدية ، والقوائم ليست هياكل البيانات الأولية.يمكن لهياكل البيانات تنفيذ إيسك الواجهة-وهي طريقة عرض أخرى لهيكل البيانات المعطاة-مما يسمح لنفس الوظائف بالوصول إلى العناصر في كل منها.(القوائم تنفذ هذا بالفعل. seq?
يتحقق ما إذا كان هناك شيء ينفذ إيسك.(seq? '(1 2)), (seq? [1 2]))
كلوجور ببساطة يعمل بشكل مختلف (لسبب وجيه) ، في ذلك عندما cons
يستخدم ، تسلسل (انها في الواقع من نوع clojure.lang.Cons
) شيدت من a
و (seq b)
يتم إرجاعها.(a
يجري أرج 1 و b
أرغ 2) من الواضح أن الرموز لا ولا يمكن تنفيذها إيسك.
تسلسل سكرينكست / نقاش ريتش هيكي ومع ذلك ، لاحظ أن rest
لقد تغير ، وهو السلوك السابق الآن next
, ، وذلك lazy-cons
تم استبداله بـ lazy-seq
و cons
.
نصائح أخرى
في سلبيات LISP المشتركة يخلق خلية سلبيات ما يسمى، مماثلة لسجل مع فتحتين: "السيارة" و "CDR".
يمكنك وضع أي شيء في تلك الفتحة من خلية سلبيات.
تستخدم الخلايافي بناء قوائم.ولكن يمكن للمرء إنشاء جميع أنواع هياكل البيانات مع خلايا سلبيات: الأشجار والرسوم البيانية وأنواع مختلفة من القوائم المتخصصة ...
تطبيقات LISP محسنة للغاية لتوفير خلايا سلبيات فعالة للغاية.
قائمة ليسب هو مجرد وسيلة شائعة لاستخدام الخلايا سلبيات (انظر وصف راينر).من الأفضل رؤية كلوجور على أنه لا يحتوي على خلايا سلبيات (على الرغم من أن شيئا مشابها قد يختبئ تحت الغطاء).كلوجور cons
هو تسمية خاطئة ، فإنه ينبغي في الواقع مجرد تسمية prepend
.
في كلوجور يفضل استخدام متجه من عنصرين: [:a :b]
.تحت غطاء محرك السيارة يتم تنفيذ هذه ناقلات صغيرة كما صفائف جافا وبسيطة للغاية وسريعة.
يد قصيرة ل (cons :a '(:b))
(أو (cons :a (cons :b nil))
) هو list
: (list :a :b)
.
عندما تقول
> (cons 'a 'b)
في اللثغة المشتركة لا تحصل على قائمة ولكن زوج منقط: (a . b)
, ، في حين أن نتيجة
> (cons 'a (cons 'b nil))
هو الزوج المنقط (a . ( b . nil))
.
في القائمة الأولى cdr()
من هذه ليست قائمة ، لأنها هنا b
و لا nil
, ، مما يجعلها قائمة غير لائقة.يجب إنهاء القوائم المناسبة بواسطة nil
.لذلك وظائف ترتيب أعلى مثل mapcar()
والأصدقاء لن يعملوا ، لكننا ننقذ خلية سلبيات.أعتقد أن مصممي كلوجور إزالة هذه الميزة بسبب الارتباك الذي يمكن أن يسبب.