كيفية تحويل كسول تسلسل إلى غير كسول في Clojure

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

  •  10-07-2019
  •  | 
  •  

سؤال

حاولت التالية في Clojure ، وتوقع أن يكون من فئة غير كسول تسلسل عاد:

(.getClass (doall (take 3 (repeatedly rand))))

ولكن هذا لا يزال يعود clojure.lang.LazySeq.تخميني هو أن doall لا تقييم كامل تسلسل ولكن يعود تسلسل الأصلي كما انها لا تزال مفيدة في التحفيظ.

فما هو اصطلاحي يعني خلق غير كسول تسلسل من كسول ؟

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

المحلول

doall هو كل ما تحتاج.فقط لأن seq لديه نوع LazySeq لا يعني أنه يجب انتظار التقييم.كسول seqs ذاكرة التخزين المؤقت نتائجها ، لذا كل ما عليك القيام به هو السير كسول بعدها مرة واحدة (كما doall لا) من أجل إجبار كل شيء ، وبالتالي جعلها غير كسول.بعدها لا لا قوة المجموعة بأكملها إلى تقييم.

نصائح أخرى

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

  • سابق كسول (من تقييمها) كسول تسلسل (doall ... )
  • قائمة من أجل الوصول المتسلسل (apply list (my-lazy-seq)) OR (into () ...)
  • ناقلات في وقت لاحق الوصول العشوائي (vec (my-lazy-seq))
  • خريطة أو مجموعة إذا كان لديك بعض الأغراض الخاصة.

هل يمكن أن يكون أي نوع من تسلسل معظم الأجنحة الاحتياجات الخاصة بك.

وهذا الرجل الغني يبدو أن نعرف كلوجر له وهو الصحيح تماما.
بوث وأعتقد أن هذا رمز المتكررة، وذلك باستخدام سبيل المثال، قد يكون مكملا مفيدا لهذا السؤال:

=> (realized? (take 3 (repeatedly rand))) 
false
=> (realized? (doall (take 3 (repeatedly rand)))) 
true

والواقع <م> نوع لم يتغير ولكن تحقيق لديه

(.getClass (into '() (take 3 (repeatedly rand))))
scroll top