рдХреНрд▓реЛрдЬрд░ - рдХреНрд░рдо

рдХреНрд▓реЛрдЬрд░ рд▓рд┐рд╕реНрдк рдХреА рдПрдХ рдмреЛрд▓реА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЖрд╢реНрдЪрд░реНрдпрдЬрдирдХ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╕реВрдЪреА рднрд╛рд╖рд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИред рд╕рд╣реА рд╣реИ, рдкрд╛рд░рдВрдкрд░рд┐рдХ рдмреЛрд▓рд┐рдпреЛрдВ (рд╕реАрдПрд▓ рдпрд╛ рд╕реНрдХреАрдо) рдХреЗ рд╡рд┐рдкрд░реАрдд, рдХреНрд▓рд╛рд╕рд┐рдХ рдбрдмрд▓-рд╕реНрд▓реЙрдЯ рд╕реВрдЪрд┐рдпреЛрдВ рдХреЗ рдмрдЬрд╛рдп, рдХреНрд▓реЛрдЬрд░ рд╕реАрдХреНрд╡реЗрдВрд╕ рдЕрдореВрд░реНрдд - "рддрд╛рд░реНрдХрд┐рдХ рд╕реВрдЪреА" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ рдЬреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп, рдЖрд▓рд╕реА рдФрд░ рд╕рдВрднрд╡рддрдГ рдЕрдирдВрдд рджреГрд╢реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд▓реЗрдЦ рдЗрди рд╕рдВрд╕реНрдерд╛рдУрдВ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред

рдХреНрд░рдореЛрдВ рдХрд╛ рд╕рд╛рд░


рд╢реБрд░реБрдЖрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рд╕реЗред рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕рднреА рд╕рдВрд░рдЪрдирд╛рдПрдВ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ clojure.lang.Seqable :

public interface Seqable { ISeq seq(); } 


рдмрджрд▓реЗ рдореЗрдВ, clojure.lang.ISeq рдХреЛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

 public interface ISeq extends IPersistentCollection { Object first(); ISeq next(); ISeq more(); ISeq cons(Object o); } 


рдпрд╣рд╛рдВ рдЖрдк рдХреНрд░рдорд╢рдГ рдЗрдЯреЗрдХреЗрдмрд▓ , рдЗрд╕реНрддреЗрдХ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рджреГрд╢реНрдп рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрдЯрд░реЗрдЯрд░ рдХрд╛ рдПрдХ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдирд╛рд▓реЙрдЧред рдЙрдирдХрд╛ рдореБрдЦреНрдп рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ ISeq рдСрдмреНрдЬреЗрдХреНрдЯ рдЕрдкрд░рд┐рд╡рд░реНрддрдиреАрдп рд╣реИрдВ: рдЗрд╕рдХреЗ рддрд░реАрдХреЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдЖрдВрддрд░рд┐рдХ рд╕реНрдерд┐рддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдирдпрд╛ рдЙрджрд╛рд╣рд░рдг (рд╢рд╛рдпрдж рдПрдХ рдЕрд▓рдЧ рдкреНрд░рдХрд╛рд░) рднреА рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕рднреА рдЕрдиреБрдХреНрд░рдо рднреА рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рд╕рдВрдЧреНрд░рд╣ рд╣реИрдВ - рд╡реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ clojure.lang.IPersistentCollection , рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Seqable :

 public interface IPersistentCollection extends Seqable { int count(); IPersistentCollection cons(Object o); IPersistentCollection empty(); boolean equiv(Object o); } 


рдпрд╣рд╛рдВ рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ - рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрд┐рдирддреАред рдЕрдиреБрдХреНрд░рдореЛрдВ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХреА рдЬрдЯрд┐рд▓рддрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ O (n) рд╣реИред рдЦрд╛рд▓реА рд╡рд┐рдзрд┐ рдЙрд╕реА рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЦрд╛рд▓реА рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддреА рд╣реИред рджреГрд╢реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, рд░рд┐рдЯрд░реНрди () ред рдЦреИрд░, рдмреБрд░рд╛ рддрд░реАрдХрд╛ рдПрдХ рдирдпрд╛ рддрддреНрд╡ рдЬреЛрдбрд╝рддрд╛ рд╣реИред

ISeq рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рднрд╛рд╖рд╛ seq рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред рдпрджрд┐ рд╕рдВрдЧреНрд░рд╣ рдЦрд╛рд▓реА рд╣реИ, рддреЛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ Seqable рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ, рддреЛ рдЙрд╕ рдкрд░ seq () рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЖрд╡рд░рдг (рдПрдбреЗрдкреНрдЯрд░) рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд░реИрдкрд░реНрд╕ рдХреЛ рд╕рд░рдгрд┐рдпреЛрдВ, рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдЬрд╛рд╡рд╛ рд╕рдВрдЧреНрд░рд╣ ( рдорд╛рдирдЪрд┐рддреНрд░ рд╕рд╣рд┐рдд) рдФрд░ рдЪрд╛рд░рд╕реНрдкреЗрдВрд╕реЗрдВрд╕ рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ (рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕) рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рд╕реВрдЪреА рдореЗрдВ рдЕрдкрдирд╛ рдкреНрд░рдХрд╛рд░ рдирд╣реАрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ - рдпрд╣ рдЬрд╛рд╡рд╛ рдХреЛрдб рдореЗрдВ "рд╕рд┐рд▓рдирд╛" рд╣реИ (рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рднреА рдорджрдж рдирд╣реАрдВ рдХрд░реЗрдЧрд╛)ред рдмреЗрд╢рдХ, рдЖрдкрдХреЛ рдПрд░реЗрдЬрд╝ (рдпрд╛ рдЬрд╛рд╡рд╛ рд╕рдВрдЧреНрд░рд╣) рдХреЛ рдмрджрд▓рдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдП, рдЕрдЧрд░ рдЙрдирдХреЗ рд▓рд┐рдП рдПрдХ рд╕реАрдХреНрд╡реЗрдВрд╕ рдмрдирд╛рдпрд╛ рдЬрд╛рдПред рддреЛ, ConcurrentModificationException рдХреЛ рдХреЗрд╡рд▓ рдКрдкрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд╕рд┐рдХреНрд╡реЗрдВрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рддреАрди рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдп рд╣реИрдВ:

рд╡рд┐рдкрдХреНрд╖ рдХреЗ рдмрдЬрд╛рдп, рд╕рдВрдпреЛрдЬрди рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрдорддреМрд░ рдкрд░ рдирдП рддрддреНрд╡реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреЛрдиреЛрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рд╣рдореЗрд╢рд╛ рдПрдХ рдмрд╕ рдХрдиреЗрдХреНрдЯ рдХреА рдЧрдИ рд╕реВрдЪреА рдореЗрдВ рдПрдХ рдирдпрд╛ рд╕реЗрд▓ рдмрдирд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рджреВрд╕рд░реЗ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╣реИ - рдЖрдЗрдЯрдо рдХреЛ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рди рдкрд░ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдо рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕реВрдЪреА рдХреА рд╢реБрд░реБрдЖрдд рд╣реИ, рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЕрдВрдд рд╣реИ, рд╕реЗрдЯ рдХреЗ рд▓рд┐рдП рдЖрджреЗрд╢ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрд╣ рдзреНрдпрд╛рди рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдЕрдЧрд░ рд╣рдордиреЗ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ seq рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдЦреЛ рджреЗрддреЗ рд╣реИрдВ:

 (conj [1 2 3] 4) ;=> [1 2 3 4] (conj (seq [1 2 3]) 4) ;=> '(4 1 2 3) 


рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдореЗрдВ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдо рд╣рдореЗрд╢рд╛ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддреЗ рд╣реИрдВ: рд╕рдВрдпреЛрдЬрди рдлрд╝рдВрдХреНрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд╡рд┐рдзрд┐ рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИ, рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдмрд╛рдХреА рд╣реИред рджреВрд╕рд░реА рдУрд░, рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд╕рдВрдЧреНрд░рд╣ рд▓рд┐рдЦрддреЗ рд╕рдордп рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдирд╛рдо рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕ рд╡реНрдпрд╡рд╕рд╛рдп рдХреЛ рд╢рд╛рдпрдж рд╣реА рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рдард╣рд░рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рд╕рднреА рдорд╛рдирдХ рдлрд╝рдВрдХреНрд╢рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ seq рдХрд╣рддреЗ рд╣реИрдВ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рд▓рд┐рдЦрддреЗ рд╣реИрдВ (cons 1 [2 3]) , рддреЛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ cons-cell рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╡реЗрдХреНрдЯрд░ [1 2] рдХреЛ рд╣реА рдирд╣реАрдВ , рдмрд▓реНрдХрд┐ рдкрд░рд┐рдгрд╛рдо (seq [1 2]) рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ред рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ (рдорд╛рдирдЪрд┐рддреНрд░, рдлрд┐рд▓реНрдЯрд░, рдЖрджрд┐) рдХреЗ рдХрд╛рдо рдХреЗ рджреМрд░рд╛рди рдПрдХ рд╣реА рдЪрд╛рд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпреЗ рд╕рднреА рдЕрдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╡реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЗрд╡рд▓ рд╕реВрдЪрд┐рдпрд╛рдБ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЛрд╢рд┐рдХрд╛рдПрдБ рд╕реАрдзреЗ рд╣реА рдЗрд╕реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИрдВ :

 (seq? '(1 2)) ;=> true (seq? ()) ;=> true (seq? (cons 1 nil)) ;=> true (seq? (cons 1 [2 3])) ;=> true (seq? [1 2]) ;=> false (seq? {:a :b}) ;=> false (seq? #{1 2}) ;=> false (seq? nil) ;=> false 


рдЗрд╕рд▓рд┐рдП, рд╕реВрдЪреА рдореЗрдВ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рджреМрд░рд╛рди, рдХреЛрдИ рднреА рдЕрд╕реНрдерд╛рдпреА рдСрдмреНрдЬреЗрдХреНрдЯ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╣рдо рд╡реЗрдХреНрдЯрд░ рдХреЗ рдКрдкрд░ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕реНрдерд╛рдпреА ISeq рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рдВрд╕реНрдХрд░рдг 1.1 рд╕реЗ рдЪреАрдЬреЗрдВ рдереЛрдбрд╝реА рдЕрд▓рдЧ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрд╕ рдкрд░ рдЕрдзрд┐рдХред

рд╡рд╣рд╛рдБ рднреА рдПрдХ "рдХреЛрдИ рдирд╣реАрдВ рдЬрд╛рдирддрд╛" рдЗрдВрдЯрд░рдлрд╝реЗрд╕ clojure.lang.IndexedSeq , рд╕рд░рдгрд┐рдпреЛрдВ рдФрд░ рддрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреНрд░рдо рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдпрд╛рдиреА рдЬрд╣рд╛рдВ рдореВрд▓ рд╕рдВрдЧреНрд░рд╣ рдореЗрдВ рд╕рд┐рд░ рд╣реИ ) рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реВрдЪрдХрд╛рдВрдХ () рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред

 (.index (rest (to-array [1 2 3 4]))) ;=> 1 (.index (rest (rest (to-array [1 2 3 4]))) ;=> 2 


рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд╣реАрдВ рднреА рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдЕрдирдбрд┐рдореНрдбрд░реНрдб рдлреАрдЪрд░)ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрд╡реЗрджрди рдХреЗ рд╕рд╛рде рдЖрдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрдард┐рди рд╣реИред рд╡реИрд╕реЗ, clojure.lang.APersistenVector $ Seq рдСрдмреНрдЬреЗрдХреНрдЯ рднреА рдЗрд╕реЗ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣рд╛рдБ рдкрд░реЗрд╢рд╛рдиреА рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП seq рд▓реМрдВрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрддрд╛ рд╣реИред lang.PersistentVector $ ChunkedSeq , рдЬрд┐рд╕рдХреА рдЕрдм рдЗрддрдиреА рд╕рдВрджрд┐рдЧреНрдз рдХреНрд╖рдорддрд╛ рдирд╣реАрдВ рд╣реИред

рдЖрд▓рд╕реА рдХреНрд░рдо


рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рджреГрд╢реНрдпреЛрдВ рдХреА рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рдЙрдирдХрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдЖрд▓рд╕реНрдп рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдореЗрдВ, рдкреВрд░реЗ рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреА "рдкреВрдВрдЫ" рдЕрднреА рддрдХ рдирд╣реАрдВ рдмрдирд╛рдИ рдЧрдИ рд╣реИред рдХреНрд▓реЛрдЬрд░ рдореЗрдВ, рдпрд╣ рдЕрдХреНрд╕рд░ I / O рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЖрд▓рд╕реНрдп рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓рддрд╛ рд╕реЗ рд╣реЛрддрд╛ рд╣реИред рд╡рд╣рд╛рдБ рдПрдХ рд╡рд░реНрдЧ рд╣реИ clojure.lang.LazySeq (рдЬреЛ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, ISeq рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ )ред рдЗрд╕ рд╡рд░реНрдЧ рдХреА рд╡рд╕реНрддреБрдУрдВ рдореЗрдВ рдПрдХ рдлрд╝рдВрдХреНрд╢рди ( IFn рдЙрджрд╛рд╣рд░рдг) рдХрд╛ рд╕рдВрджрд░реНрдн рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ, рдЬрдм рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рдЕрдиреБрдХреНрд░рдо рд╕реНрд╡рдпрдВ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдП (рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ рдХрд┐ рдЖрд▓рд╕реА рднреА, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ)ред LazySeq рд╡рд┐рдзрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдИ рднреА рдХреЙрд▓ рдЬрдирд░реЗрдЯрд┐рдВрдЧ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рд▓рд┐рдВрдХ рд╕реНрд╡рдпрдВ рд░реАрд╕реЗрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдХрдЪрд░рд╛ рдХрд▓реЗрдХреНрдЯрд░ рдХреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП)ред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдкрд┐рдЫрд▓реЗ рд╕рднреА рдХреА рдЧрдгрдирд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рдЖрд▓рд╕реА рдЕрдиреБрдХреНрд░рдо рдХрд╛ рдПрдХ рддрддреНрд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдЗрд╕ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдЖрдк рджреЗрд░реА рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 (nth (map #(print % "") (iterate inc 0)) 5) ;=> 1 2 3 4 5 @(nth (map #(delay (print % "")) (iterate inc 0)) 5) ;=> 5 


рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЖрд▓рд╕реА рдХреНрд░рдо рдЙрддреНрдкрдиреНрди рдХрд░рдирд╛ рд╣рд╛рд╕реНрдпрд╛рд╕реНрдкрдж рд╕рд░рд▓ рд╣реИред рдпрд╣ рдХреЛрдб рдХреЛ рдбрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ рдЬреЛ рдЖрд▓рд╕реА-рд╕реАрдХ рдореИрдХреНрд░реЛ рдХреЗ рдЕрдВрджрд░ рд╡рд┐рдкрдХреНрд╖ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХрд┐рд╕реА рдХреЛ рднреА рдпрд╣ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдирд╣реАрдВ рдХрд░рдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ - рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдирдХ рдХрд╛рд░реНрдп (рдмрд╣реБрдд рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде) рд╕рд┐рд░реНрдл рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рд▓рд┐рдП рд╕рднреА "рдЧрдВрджреЗ" рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рд╕рддреНрдп рдФрд░ рдорд╛рдореВрд▓реА рдмрд╛рд░реАрдХрд┐рдпрд╛рдБ рд╣реИрдВред

рддреЛ, рдЗрд╕рдХреА рдЧрдгрдирд╛ рдореЗрдВ, рдЖрд▓рд╕реА рдЕрдиреБрдХреНрд░рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рд╕рд░рд▓, рдмрд╕ рдЬреБрдбрд╝реА рд╣реБрдИ рд╕реВрдЪреА рдореЗрдВ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕реНрдореГрддрд┐ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдХреНрд▓рд╛рд╕рд┐рдХ рдЙрджрд╛рд╣рд░рдг:

 (def all-odds (filter odd? (range))) (println (nth all-odds 20000000)) 


рдпрд╣рд╛рдВ рд╣рдо 20,000,000 рд╡реЗрдВ рд╡рд┐рд╖рдо рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдФрд░ рдпрд╣ рдЗрд╕реЗ рдвреВрдБрдврддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдордзреНрдпрд╡рд░реНрддреА рдЗрд╕реНрдХрд┐рдо рдХреЗ рдЙрджрд╛рд╣рд░рдг рд╣реИрдВ рдЬреЛ рд╕реНрдореГрддрд┐ рдореЗрдВ рдмрдиреЗ рд╣реБрдП рд╣реИрдВред рд╕рд╣реА рдирд┐рд░реНрдгрдп:

 (defn make-all-odds [] (filter odd? (range))) (println (nth (make-all-odds) 2000000)) 


рдмрд╛рдХреА рдлрд╝рдВрдХреНрд╢рди рдХрднреА рднреА рд╢реВрдиреНрдп рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдпрд╣ рдПрдХ рдЦрд╛рд▓реА рдЕрдиреБрдХреНрд░рдо рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рд╣рдо рд╢реВрдиреНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЕрдЧрд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

 (first '(1 2 3)) ;=> 1 (rest '(1 2 3)) ;=> '(2 3) (rest '(1)) ;=> () (rest ()) ;=> () (next '(1)) ;=> nil (next ()) ;=> nil 


рдпрд╣ рдЕрдзрд┐рдХ рдЖрд▓рд╕реНрдп рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЕрдиреБрдХреНрд░рдо рдЖрд▓рд╕реА рд╣реИ, рддреЛ рд╕рд╛рдорд╛рдиреНрдп рдорд╛рдорд▓реЗ рдореЗрдВ рд╣рдо рдирд╣реАрдВ рдЬрд╛рдирддреЗ рдХрд┐ рдЗрд╕рдореЗрдВ рдЕрдзрд┐рдХ рддрддреНрд╡ рд╣реИрдВ рдпрд╛ рдирд╣реАрдВред рдЗрд╕ рддрдереНрдп рдХреЛ рдЕрдЧрд▓реЗ рдХреЗ рд╕рд╛рде рд╕рддреНрдпрд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП , рд╣рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реЗ 2 рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ: рд╣рдо рдкрд╣рд▓реЗ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗ, рдФрд░ рджреВрд╕рд░реЗ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рд╣рдо рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдХреНрдпрд╛ рд╢реВрдиреНрдп рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЦреИрд░, 2 рддрддреНрд╡реЛрдВ рдХреА рдЧрдгрдирд╛ - рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд╡рд╣ рдирд╣реАрдВ рд╣реИ рдЬреЛ рд╣рдореЗрдВ рдЖрдорддреМрд░ рдкрд░ рдЪрд╛рд╣рд┐рдПред

рдпрджрд┐ рдЖрд▓рд╕реА рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкреВрд░реЗ рдЕрдиреБрдХреНрд░рдо рдХреЛ рдбреЛрд░реБрди рдФрд░ рдбреЙрд▓ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ ред рдкрд╣рд▓рд╛ рдореВрд▓ рдЕрдиреБрдХреНрд░рдо рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рджреВрд╕рд░рд╛ - рд╢реВрдиреНрдпред

 (dorun (map #(println % "") (range 5)));=> 1 2 3 4 5 


рдмреНрд▓реЙрдХ рдЕрдиреБрдХреНрд░рдо


рдЖрд▓рд╕реА рд╕рдВрдЧреНрд░рд╣ рдПрдХ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ, рд▓реЗрдХрд┐рди рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ рд╣рдо рдЕрдХреНрд╕рд░ рдкреВрд░реЗ рд╕рдВрдЧреНрд░рд╣ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЖрд▓рд╕реА-рд╕реЗрдХ рдореВрд░реНрдд рдЙрдкрд░рд┐ рд▓рд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╕рдВрд╕реНрдХрд░рдг 1.1 рдореЗрдВ, рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ - chunked seqencesред рдиреАрдЪреЗ рдХреА рд░реЗрдЦрд╛ рд╕рд░рд▓ рд╣реИ - рдЬрдм рдЖрд▓рд╕реА рджреГрд╢реНрдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдЙрдирдХреЗ рд╕рдореВрд╣реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЙрд╕реА рд╕рдордп, "рд╡рд┐рдХрд╛рд╕" рддрддреНрд╡реЛрдВ рдХреА рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд▓рд╛рд▓рдЪ рд╕реЗ рдЧрдгрдирд╛ рдХреА рдЬрд╛рддреА рд╣реИред

рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреЛрдб рдЖрдЙрдЯрдкреБрдЯ рдХреНрдпрд╛ рд╣реИ?
 (first (map #(print % "") (range 100))) 

рдЬрд╡рд╛рдм рд╣реИ
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 29 30 31


рддреЛ, рдХреНрд▓реЛрдЬрд░ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ clojure.lang.IChunkedSeq рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕ рддрдВрддреНрд░ рдХреЗ рдЬрд╛рд╡рд╛ рднрд╛рдЧ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕реЗ рдЫреЛрдбрд╝ рджреВрдВрдЧрд╛ред рд╡реИрдХреНрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдЕрдиреБрдХреНрд░рдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВред рдареАрдХ рд╣реИ, рдФрд░, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд░реЗрдВрдЬ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдкрд░рд┐рдгрд╛рдо рд╣реИред

рдЗрд╕ рддрд░рд╣ рдХреЗ рджреГрд╢реНрдпреЛрдВ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо:


рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рд╣рдо рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди # (рд╡рд┐рд╖рдо рд╡рд┐рд╖рдо?%) рд▓рд┐рдЦреЗрдВрдЧреЗред рдПрдХ рд╕рд░рд▓ рд╡рд┐рдХрд▓реНрдк:

 (defn filter-odd-1 [a] (lazy-seq (when-let [s (seq a)] (let [f (first s) r (rest s)] (if (odd? f) (cons f (filter-odd-1 r)) (filter-odd-1 r)))))) 


рдЙрдиреНрдирдд рд╡рд┐рдХрд▓реНрдк (рдмреНрд▓реЙрдХ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде):

 (defn filter-odd-2 [a] (lazy-seq (when-let [s (seq a)] (if (chunked-seq? s) (let [f (chunk-first s) c (count f) b (chunk-buffer c)] (dotimes [ic] (let [x (nth fi)] (when (odd? x) (chunk-append bx)))) (chunk-cons (chunk b) (filter-odd-2 (chunk-rest s)))) (let [f (first s) r (rest s)] (if (odd? f) (cons f (filter-odd-2 r)) (filter-odd-2 r))))))) 


рдмреЗрд╢рдХ, рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдХреЛрдб рдерд╛, рдФрд░ рд╕реНрдкрд╖реНрдЯ рджреЛрд╣рд░рд╛рд╡ рдерд╛: рд╣рдореЗрдВ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛рдиреЗ рдереЗред рд▓реЗрдХрд┐рди рдРрд╕реА рдЧрддрд┐ рдХреА рдХреАрдордд рд╣реИред рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рдорд╛рдирдХ рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡рд┐рдЦрдВрдбреВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИрдВред рдореИрдВ рдзреНрдпрд╛рди рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд▓рдВрдмрд╛рдИ рдХреЗ рдмреНрд▓реЙрдХ рд╢рд╛рдорд┐рд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ (рдмреНрд▓реЙрдХ рдПрдХ рд╕рд╛рде рдЪрд┐рдкрдХрддреЗ рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХрднреА-рдХрднреА рд╡реЗ рдХрдЯ рдЬрд╛рддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рд╣реИ), рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕рд╛рдорд╛рдиреНрдп рддрддреНрд╡реЛрдВ рдФрд░ рдмреНрд▓реЙрдХреЛрдВ рдХрд╛ рдорд┐рд╢реНрд░рдг рднреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдпрджрд┐ рд╣рдо рдПрдХ рдирд┐рдпрдорд┐рдд рдЕрдиреБрдХреНрд░рдо рдХреЛ рдмреНрд▓реЙрдХ рдЕрдиреБрдХреНрд░рдо рдореЗрдВ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ? рдЖрдкрдХреЛ рдмрд╕ vec рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдХрд╛рдВрд╕реЗрдкреНрдЯ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ:

 (defn seq1 [s] (lazy-seq (when-let [x (seq s)] (cons (first x) (seq1 (rest x)))))) (first (map println (seq1 (range 1000)))) ;=> 1 

рд╡реИрдХрд▓реНрдкрд┐рдХ рд╕рдорд╛рдзрд╛рди
 (defn seq1 [^clojure.lang.ISeq s] (reify clojure.lang.ISeq (first [_] (.first s)) (more [_] (seq1 (.more s))) (next [_] (let [sn (.next s)] (and sn (seq1 sn)))) (seq [_] (let [ss (.seq s)] (and ss (seq1 ss)))) (count [_] (.count s)) (cons [_ o] (.cons so)) (empty [_] (.empty s)) (equiv [_ o] (.equiv so)))) 


рдпрд╣ рднреА рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрдо рдлрд╝рдВрдХреНрд╢рди рдмреНрд▓реЙрдХ рдЕрдиреБрдХреНрд░рдореЛрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред рддреЛ, рдкреНрд░рддреНрдпреЗрдХ рдмреНрд▓реЙрдХ рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рд╣реЛрддреА рд╣реИ рдЬреЛ рдЕрд╕реНрдерд╛рдпреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдП рдмрд┐рдирд╛ рдПрдХ рдЬрд╛рд╡рд╛ рдЪрдХреНрд░ рдореЗрдВ рд╕рдВрдХреЗрддрди рдХрд░рддреА рд╣реИред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдХрдо рдореЗрдВ рдЕрдиреНрдп рдЕрдиреБрдХреВрд▓рди рднреА рд╣реЛрддреЗ рд╣реИрдВ , рд╣рд░ рдХреЛрдИ рджрд┐рд▓рдЪрд╕реНрдкреА clojure.core.protocols рджреЗрдЦ рд╕рдХрддрд╛ рд╣реИ ред

рдПрдХ рдирд┐рд╖реНрдХрд░реНрд╖ рдХреЗ рдмрдЬрд╛рдп


рдХреНрд▓реЛрдЬрд░ рдЕрдиреБрдХреНрд░рдо рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИрдВред рдЙрдирдХреА рдирд┐рд╕реНрд╕рдВрджреЗрд╣ рдкреНрд▓рд╕ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдХреНрд╕рд░ рдЖрдк рдЗрд╕ рддрд░рд╣ рдХреЗ "trifles" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪ рднреА рдирд╣реАрдВ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЖрд▓рд╕реНрдп рдпрд╛ рдмреНрд▓реЙрдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг - рдХреНрд▓реЛрдЬрд░ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИред

Source: https://habr.com/ru/post/In160235/


All Articles