рд╣рдо рдХреНрд▓реЛрдЬрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдПрдХ рдЬрд╛рд╡рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ

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

рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд▓реЗрдВ:

(ns clj-lib.core (:use clj-lib.util)) (defn prod ([x] (reduce * x)) ([sx] (reduce * sx))) (defprotocol IAppendable (append [this value])) (extend-protocol IAppendable Integer (append [this value] (+ this value)) String (append [this value] (str this "," value))) (defmulti pretty type) (defmethod pretty Integer [x] (str "int " x)) (defmethod pretty String [x] (str "str " x)) 

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

рдорд╛рдирдХ рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлреЗрд╕


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

рд╕рднреА рдХрд╛рд░реНрдп 2 рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ java.lang.Runnable рдФрд░ java.util.concurrent.Callable рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ ред рдпрд╣ java.lang.concurent рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рд╕реАрдзреЗ рдХреНрд▓реЛрдЬрд╝рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрдХреЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ)ред

рд▓рдВрдмреЗ рдЕрдВрдХрдЧрдгрд┐рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп, рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреНрд▓реЛрдЬрд░ рдХреЗ рдкрд╛рд╕ рд▓рдВрдмреЗ рдкреВрд░реНрдгрд╛рдВрдХ clojure.lang.BigInt рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рд╣реИред рдЙрд╕реА рд╕рдордп, рдХреНрд▓реЙрдЬреБрд░ рдорд╛рдирдХ java.util.math.BigInteger рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓рдВрдмреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХреЛрдИ "рдЖрд╢реНрдЪрд░реНрдп" рдирд╣реАрдВ рд╣реИ - рдорд╛рдирдХ java.util.math.BigDecimal рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддрд░реНрдХрд╕рдВрдЧрдд рднрд┐рдиреНрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдХреНрд▓реЛрдЬрд░.рд▓рдВрдЧ.рд░реИрдЯреЛ рднреА рд╣реИред

рд╕рдВрдХрд▓рди рдФрд░ рдЬреАрди-рд╡рд░реНрдЧ


рд╕рдВрднрд╡рддрдГ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд╡рд┐рдХрд▓реНрдк рдХреНрд▓реЛрдЬрд░ рдХреЛрдб рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдирд╛ рдФрд░ рдХреНрд▓рд╛рд╕ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рд╣реИред рд╣рдо рдЕрдкрдиреЗ рдирд╛рдо рд╕реНрдерд╛рди рдХреА рдШреЛрд╖рдгрд╛ рдХреЗ рд▓рд┐рдП рдЬрдирд░рд▓-рдХреНрд▓рд╛рд╕ рдХрдорд╛рдВрдб рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ:

 (ns clj-lib.core (:use clj-lib.util) (:gen-class :main false :name "cljlib.CljLibCore" :prefix "" :methods [^:static [prod [Iterable] Number] ^:static [prod [Number Iterable] Number] ^:static [append [Object Object] Object] ^:static [pretty [Object] Object]])) ... 


рдпрд╣рд╛рдВ рд╣рдордиреЗ Iterable рдХреЛ рдареЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рддрд░реНрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рд╣реИ ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк ISeq , рдПрдХ рд╕рд░рдгреА рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдЬрд╛рд╡рд╛ рдореЗрдВ рдпрд╣ рдЗрд╕ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реЛрдЧрд╛ред
рдЖрдк рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЗ рдирд╛рдо рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ clj_lib.core рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред Clj_lib.core.IAppendable class рдХреЛ clj_lib.core рдкреИрдХреЗрдЬ рдореЗрдВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣реА рд╣реИ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╡рд░реНрдЧ рдФрд░ рдПрдХ рд╣реА рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдХреЗрдЬ рд╣реЛрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рд╡рд░реНрдЧ рдирд╛рдо рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред

рдЙрд╕рдХреЗ рдмрд╛рдж, рдЖрдкрдХреЛ рдирд╛рдорд╕реНрдерд╛рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╣рдо REPL'e рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 (compile 'clj-lib.core) 

рд╣рдореЗрдВ рдХрдХреНрд╖рд╛рдПрдВ / cljlib / CljLibCore.class рдлрд╝рд╛рдЗрд▓ рдорд┐рд▓рддреА рд╣реИ , рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЖрд░рдИрдкреАрдПрд▓ рдХрд╛ рд╕рдВрдХрд▓рди рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдПрдХ рд▓реЗрдирд┐рдВрдЧ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИ:
 (defproject clj-lib ... :aot [my-app.core], ... ) 

рдЕрдм рдПрдХ рдЬрд╛рд░ рдмрдирд╛рддреЗ рд╕рдордп, рд▓реЗрдирд┐рдВрдЧреЗрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╛рдо рд╕реНрдерд╛рди рдХрд╛ рд╕рдВрдХрд▓рди рдХрд░реЗрдЧрд╛ред рд╣рдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
 lein jar 

рд╣рдо рдЕрдкрдиреЗ Java рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП my-lib.jar рдФрд░ clojure.jar рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ:
 import java.math.BigDecimal; import java.util.Arrays; import java.util.List; import clj_lib.core.IAppendable; import cljlib.CljLibCore; public class Program { static void pr(Object v) { System.out.println(v); } static class SomeClass implements IAppendable { public Object append(Object value) { // some code return null; } } public static void main(String[] args) throws Exception { pr(CljLibCore.pretty(1)); pr(CljLibCore.pretty("x")); Integer x = (Integer) CljLibCore.append(-1, 1); pr(CljLibCore.append(x, 1)); pr(CljLibCore.append(new SomeClass(), new SomeClass())); List<Integer> v = Arrays.asList(1, 2, 3, 4, 5); pr(CljLibCore.prod(v)); pr(CljLibCore.prod(BigDecimal.ONE, v)); } } 

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

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

рд╣рдо clojure.lang.RT рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ


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


рдФрд░ рдХрдИ рдФрд░, рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд▓рд┐рдП рдореБрдбрд╝рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдк рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдХ рдордирдорд╛рдирд╛ рдХрд╛рд░реНрдп рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ:
 RT.var("clojure.core", "eval").invoke("(+ 1 2)"); 

рд╣рдо рдЖрд░рдЯреА рд╡рд░реНрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрд░реЛрдХреНрдд рдЙрджрд╛рд╣рд░рдг рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 import java.math.BigDecimal; import clojure.lang.RT; import clojure.lang.Sequential; import clojure.lang.Var; public class Program { static void pr(Object v) { System.out.println(v); } public static void main(String[] args) throws Exception { Var pretty = RT.var("clj-lib.core", "pretty"); Var append = RT.var("clj-lib.core", "append"); Var prod = RT.var("clj-lib.core", "prod"); pr(pretty.invoke(1)); pr(pretty.invoke("x")); Integer x = (Integer) append.invoke(-1, 1); pr(append.invoke(x, 1)); Sequential v = RT.vector(1, 2, 3, 4, 5); pr(prod.invoke(v)); pr(prod.invoke(BigDecimal.ONE, v)); } } 


рдЕрдм рд╣рдо рдЬрд╛рд╡рд╛ рд╕реЗ рд╕реАрдзреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - IAppendable рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рд╣рдорд╛рд░реА рдЬрд╛рд╡рд╛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддреЗ рд╕рдордп рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдУрдЯреА рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдФрд░ рдкреБрдирд░реАрдХреНрд╖рдг


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдПрдХ рдЕрд▓рдЧ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдмрд▓реНрдХрд┐ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд╣рдо рдЬрд╛рд╡рд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
 public interface ICljLibCore { Number prod(Iterable x); Number prod(Number s, Iterable x); Object append(Object self, Object value); String pretty(Object x); } 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рдПрдХ рд╕рдорд╛рди рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВ:
 (defn get-lib [] (reify ICljLibCore (prod [_ x] (prod x)) (prod [_ sx] (prod x)) (append [_ tv] (append tv)) (pretty [_ x] (pretty x)))) 

рдкреБрд╕реНрддрдХрд╛рд▓рдп рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди, рд╣рдо ICljLibCore рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдПрдХ рд╕реНрдерд┐рд░ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
  public static final ICljLibCore CLJ_LIB_CORE = (ICljLibCore) RT.var("clj-lib.core", "get-lib").invoke(); ... CLJ_LIB_CORE.pretty("1"); 

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

рдирд┐рд╖реНрдХрд░реНрд╖


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

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


All Articles