سلبيات اللثغة الشائعة تنشئ قائمة من رمزين,سلبيات كلوجور تتطلب ما يليها سلبيات?

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

سؤال

(تنويه-أنا على بينة من أهمية سيكس في كلوجور)

في اللثغة المشتركة ، يمكن استخدام وظيفة السلبيات لدمج رمزين في قائمة:

(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) من الواضح أن الرموز لا ولا يمكن تنفيذها إيسك.

Clojure.org/sequences

تسلسل سكرينكست / نقاش ريتش هيكي ومع ذلك ، لاحظ أن 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() والأصدقاء لن يعملوا ، لكننا ننقذ خلية سلبيات.أعتقد أن مصممي كلوجور إزالة هذه الميزة بسبب الارتباك الذي يمكن أن يسبب.

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