التسلسلات الكسولة والتدفقات اللانهائية
أتقن التسلسلات الكسولة في Clojure لنمذجة التدفقات اللانهائية وتأجيل الحساب ومعالجة البيانات بكفاءة دون استهلاك الذاكرة بشكل مفرط.
التسلسلات الكسولة والتدفقات اللانهائية درس مجاني في Clojure Functional Programming & JVM Backend Development على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Clojure Functional Programming & JVM Backend Development، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Clojure Functional Programming & JVM Backend Development 4 دروس في المجموع.
بعض أجزاء هذا الدرس لم تُترجم بعد وتظهر باللغة الإنجليزية.
What Is Laziness?
A lazy sequence computes its elements only as they are needed. This lets you describe potentially infinite data and consume just the part you want.
An Infinite Range
range with no arguments returns an infinite lazy sequence. It never materializes fully; you take only what you need.
(take 5 (range))
; => (0 1 2 3 4)iterate
iterate builds an infinite sequence by repeatedly applying a function to a starting value.
(take 5 (iterate (fn [x] (* x 2)) 1))
; => (1 2 4 8 16)repeat and cycle
repeat yields the same value forever; cycle loops a collection forever. Both are lazy.
(take 3 (repeat :x)) ; => (:x :x :x)
(take 5 (cycle [1 2])) ; => (1 2 1 2 1)lazy-seq
You build your own lazy sequences with lazy-seq. The body runs only when the next element is requested.
(defn nums-from [n]
(lazy-seq
(cons n (nums-from (inc n)))))
(take 4 (nums-from 10)) ; => (10 11 12 13)Lazy Transformations
map, filter, and take-while are all lazy. Chaining them does no work until you consume the result.
(->> (range)
(map (fn [x] (* x x)))
(filter even?)
(take 4))
; => (0 4 16 36)Realization & Chunking
Lazy seqs are realized in chunks of 32 for efficiency. So asking for one element may compute up to 32. Keep transformations side-effect-free to avoid surprises.
(first (map (fn [x] (println "seen" x) x) (range 100)))
; prints 0..31 due to chunkingForcing Realization
Use doall to fully realize a lazy sequence (e.g. to trigger side effects), or dorun when you do not need the results.
(doall (map println [1 2 3]))Avoiding the Head-Holding Trap
If you keep a reference to the head of an infinite seq while walking it, the whole realized portion stays in memory. Let go of the head to allow garbage collection.
; Bad: binding holds the head
(let [s (range)] (last (take 1000000 s)))Practical Stream: Fibonacci
Lazy sequences elegantly express recursive streams like Fibonacci numbers.
(def fibs
(map first
(iterate (fn [[a b]] [b (+ a b)]) [0 1])))
(take 7 fibs) ; => (0 1 1 2 3 5 8)Laziness vs Transducers
Lazy seqs build intermediate sequences; transducers (from a prior lesson) avoid them. Use laziness for infinite/streamed data and transducers for high-throughput pipelines.
Quick Check
Test your lazy-sequence intuition.
Recap
You learned how lazy sequences defer computation and model infinite streams.
- Generate with
range,iterate,repeat,cycle,lazy-seq map/filterstay lazy until consumed- Beware chunking and head-holding
الأسئلة الشائعة
هل درس «التسلسلات الكسولة والتدفقات اللانهائية» مجاني؟
نعم — نص درس «التسلسلات الكسولة والتدفقات اللانهائية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Clojure Functional Programming & JVM Backend Development، انتقل إلى CoddyKit PRO. تتضمن دورة Clojure Functional Programming & JVM Backend Development 4 دروس في المجموع.
ماذا ستتعلم في «التسلسلات الكسولة والتدفقات اللانهائية»؟
أتقن التسلسلات الكسولة في Clojure لنمذجة التدفقات اللانهائية وتأجيل الحساب ومعالجة البيانات بكفاءة دون استهلاك الذاكرة بشكل مفرط. تتمرن على Clojure Functional Programming & JVM Backend Development مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ Clojure Functional Programming & JVM Backend Development؟
لا تُشترط خبرة سابقة. Clojure Functional Programming & JVM Backend Development على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التسلسلات الكسولة والتدفقات اللانهائية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس Clojure Functional Programming & JVM Backend Development هذا؟
نعم. كل درس في Clojure Functional Programming & JVM Backend Development يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المحوّلات لمعالجة فعّالة
- المونادات والتجريدات الوظيفية
- الاختبار القائم على الخصائص باستخدام clojure.test.check
- التسلسلات الكسولة والتدفقات اللانهائية