clojure 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +21 -0
- data/LICENSE +23 -0
- data/README.rdoc +18 -0
- data/Rakefile +18 -0
- data/VERSION +1 -0
- data/bin/clj +13 -0
- data/epl-v10.html +261 -0
- data/lib/clojure/asm/AnnotationVisitor.class +0 -0
- data/lib/clojure/asm/AnnotationWriter.class +0 -0
- data/lib/clojure/asm/Attribute.class +0 -0
- data/lib/clojure/asm/ByteVector.class +0 -0
- data/lib/clojure/asm/ClassAdapter.class +0 -0
- data/lib/clojure/asm/ClassReader.class +0 -0
- data/lib/clojure/asm/ClassVisitor.class +0 -0
- data/lib/clojure/asm/ClassWriter.class +0 -0
- data/lib/clojure/asm/Edge.class +0 -0
- data/lib/clojure/asm/FieldVisitor.class +0 -0
- data/lib/clojure/asm/FieldWriter.class +0 -0
- data/lib/clojure/asm/Frame.class +0 -0
- data/lib/clojure/asm/Handler.class +0 -0
- data/lib/clojure/asm/Item.class +0 -0
- data/lib/clojure/asm/Label.class +0 -0
- data/lib/clojure/asm/MethodAdapter.class +0 -0
- data/lib/clojure/asm/MethodVisitor.class +0 -0
- data/lib/clojure/asm/MethodWriter.class +0 -0
- data/lib/clojure/asm/Opcodes.class +0 -0
- data/lib/clojure/asm/Type.class +0 -0
- data/lib/clojure/asm/commons/AdviceAdapter.class +0 -0
- data/lib/clojure/asm/commons/AnalyzerAdapter.class +0 -0
- data/lib/clojure/asm/commons/CodeSizeEvaluator.class +0 -0
- data/lib/clojure/asm/commons/EmptyVisitor.class +0 -0
- data/lib/clojure/asm/commons/GeneratorAdapter.class +0 -0
- data/lib/clojure/asm/commons/LocalVariablesSorter.class +0 -0
- data/lib/clojure/asm/commons/Method.class +0 -0
- data/lib/clojure/asm/commons/SerialVersionUIDAdder$Item.class +0 -0
- data/lib/clojure/asm/commons/SerialVersionUIDAdder.class +0 -0
- data/lib/clojure/asm/commons/StaticInitMerger.class +0 -0
- data/lib/clojure/asm/commons/TableSwitchGenerator.class +0 -0
- data/lib/clojure/core$_DOT__DOT___3630.class +0 -0
- data/lib/clojure/core$_EQ__EQ___3398.class +0 -0
- data/lib/clojure/core$_EQ___3291.class +0 -0
- data/lib/clojure/core$_GT__EQ___3390.class +0 -0
- data/lib/clojure/core$_GT___3382.class +0 -0
- data/lib/clojure/core$_LT__EQ___3374.class +0 -0
- data/lib/clojure/core$_LT___3366.class +0 -0
- data/lib/clojure/core$_PLUS___3332.class +0 -0
- data/lib/clojure/core$_SLASH___3350.class +0 -0
- data/lib/clojure/core$_STAR___3341.class +0 -0
- data/lib/clojure/core$__GT___3634.class +0 -0
- data/lib/clojure/core$___3358.class +0 -0
- data/lib/clojure/core$accessor__4294.class +0 -0
- data/lib/clojure/core$aclone__4211.class +0 -0
- data/lib/clojure/core$add_classpath__4707.class +0 -0
- data/lib/clojure/core$add_doc__5153.class +0 -0
- data/lib/clojure/core$add_watch__3697.class +0 -0
- data/lib/clojure/core$add_watcher__3703$fn__3705.class +0 -0
- data/lib/clojure/core$add_watcher__3703.class +0 -0
- data/lib/clojure/core$agent__3684.class +0 -0
- data/lib/clojure/core$agent_errors__3712.class +0 -0
- data/lib/clojure/core$aget__4217.class +0 -0
- data/lib/clojure/core$alength__4205.class +0 -0
- data/lib/clojure/core$alias__4367.class +0 -0
- data/lib/clojure/core$all_ns__4318.class +0 -0
- data/lib/clojure/core$alter__3759.class +0 -0
- data/lib/clojure/core$alter_meta_BANG___3750.class +0 -0
- data/lib/clojure/core$alter_var_root__4827.class +0 -0
- data/lib/clojure/core$amap__4725.class +0 -0
- data/lib/clojure/core$ancestors__4866$fn__4869.class +0 -0
- data/lib/clojure/core$ancestors__4866.class +0 -0
- data/lib/clojure/core$and__3308.class +0 -0
- data/lib/clojure/core$apply__3243.class +0 -0
- data/lib/clojure/core$areduce__4729.class +0 -0
- data/lib/clojure/core$array__4040.class +0 -0
- data/lib/clojure/core$array_map__4401.class +0 -0
- data/lib/clojure/core$aset__4224.class +0 -0
- data/lib/clojure/core$aset_boolean__4244.class +0 -0
- data/lib/clojure/core$aset_byte__4260.class +0 -0
- data/lib/clojure/core$aset_char__4264.class +0 -0
- data/lib/clojure/core$aset_double__4252.class +0 -0
- data/lib/clojure/core$aset_float__4248.class +0 -0
- data/lib/clojure/core$aset_int__4236.class +0 -0
- data/lib/clojure/core$aset_long__4240.class +0 -0
- data/lib/clojure/core$aset_short__4256.class +0 -0
- data/lib/clojure/core$asm_type__5683.class +0 -0
- data/lib/clojure/core$assert__4528.class +0 -0
- data/lib/clojure/core$assert_args__3659.class +0 -0
- data/lib/clojure/core$assoc__3148.class +0 -0
- data/lib/clojure/core$assoc_in__5075.class +0 -0
- data/lib/clojure/core$associative_QMARK___5102.class +0 -0
- data/lib/clojure/core$atom__3728.class +0 -0
- data/lib/clojure/core$await1__4014.class +0 -0
- data/lib/clojure/core$await__4007$count_down__4009.class +0 -0
- data/lib/clojure/core$await__4007.class +0 -0
- data/lib/clojure/core$await_for__4017$count_down__4019.class +0 -0
- data/lib/clojure/core$await_for__4017.class +0 -0
- data/lib/clojure/core$bases__4836.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5305$fn__5307.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5305.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5321$thisfn__5323$fn__5324.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5321$thisfn__5323.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5321.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5330.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5333.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5336.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5339.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5342.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5346.class +0 -0
- data/lib/clojure/core$bean__5303$fn__5349.class +0 -0
- data/lib/clojure/core$bean__5303$snapshot__5315$fn__5317.class +0 -0
- data/lib/clojure/core$bean__5303$snapshot__5315.class +0 -0
- data/lib/clojure/core$bean__5303$v__5312.class +0 -0
- data/lib/clojure/core$bean__5303.class +0 -0
- data/lib/clojure/core$bigdec__4136.class +0 -0
- data/lib/clojure/core$bigint__4133.class +0 -0
- data/lib/clojure/core$binding__3672$var_ize__3674.class +0 -0
- data/lib/clojure/core$binding__3672.class +0 -0
- data/lib/clojure/core$bit_and__3509.class +0 -0
- data/lib/clojure/core$bit_and_not__3524.class +0 -0
- data/lib/clojure/core$bit_clear__3527.class +0 -0
- data/lib/clojure/core$bit_flip__3533.class +0 -0
- data/lib/clojure/core$bit_not__3503.class +0 -0
- data/lib/clojure/core$bit_or__3515.class +0 -0
- data/lib/clojure/core$bit_set__3530.class +0 -0
- data/lib/clojure/core$bit_shift_left__3539.class +0 -0
- data/lib/clojure/core$bit_shift_right__3542.class +0 -0
- data/lib/clojure/core$bit_test__3536.class +0 -0
- data/lib/clojure/core$bit_xor__3521.class +0 -0
- data/lib/clojure/core$boolean__4101.class +0 -0
- data/lib/clojure/core$bound_fn__4679$fn__4681.class +0 -0
- data/lib/clojure/core$bound_fn__4679.class +0 -0
- data/lib/clojure/core$butlast__3156.class +0 -0
- data/lib/clojure/core$byte__4089.class +0 -0
- data/lib/clojure/core$cast__3160.class +0 -0
- data/lib/clojure/core$char__4095.class +0 -0
- data/lib/clojure/core$class_QMARK___4824.class +0 -0
- data/lib/clojure/core$class__4043.class +0 -0
- data/lib/clojure/core$clear_agent_errors__3715.class +0 -0
- data/lib/clojure/core$clojure_version__5781.class +0 -0
- data/lib/clojure/core$coll_QMARK___5087.class +0 -0
- data/lib/clojure/core$comment__4501.class +0 -0
- data/lib/clojure/core$commute__3756.class +0 -0
- data/lib/clojure/core$comp__3775$fn__3777.class +0 -0
- data/lib/clojure/core$comp__3775.class +0 -0
- data/lib/clojure/core$comparator__3965$fn__3967.class +0 -0
- data/lib/clojure/core$comparator__3965.class +0 -0
- data/lib/clojure/core$compare__3304.class +0 -0
- data/lib/clojure/core$compare_and_set_BANG___3738.class +0 -0
- data/lib/clojure/core$compile__5065$fn__5067.class +0 -0
- data/lib/clojure/core$compile__5065.class +0 -0
- data/lib/clojure/core$complement__3551$fn__3553.class +0 -0
- data/lib/clojure/core$complement__3551.class +0 -0
- data/lib/clojure/core$concat__3255$cat__3269$fn__3270.class +0 -0
- data/lib/clojure/core$concat__3255$cat__3269.class +0 -0
- data/lib/clojure/core$concat__3255$fn__3257.class +0 -0
- data/lib/clojure/core$concat__3255$fn__3261.class +0 -0
- data/lib/clojure/core$concat__3255$fn__3265.class +0 -0
- data/lib/clojure/core$concat__3255.class +0 -0
- data/lib/clojure/core$cond__3237.class +0 -0
- data/lib/clojure/core$condp__5146$emit__5148.class +0 -0
- data/lib/clojure/core$condp__5146.class +0 -0
- data/lib/clojure/core$conj__3121.class +0 -0
- data/lib/clojure/core$cons__3107.class +0 -0
- data/lib/clojure/core$constantly__3560$fn__3562.class +0 -0
- data/lib/clojure/core$constantly__3560.class +0 -0
- data/lib/clojure/core$construct_proxy__5265.class +0 -0
- data/lib/clojure/core$contains_QMARK___3582.class +0 -0
- data/lib/clojure/core$count__3569.class +0 -0
- data/lib/clojure/core$counted_QMARK___5111.class +0 -0
- data/lib/clojure/core$create_ns__4312.class +0 -0
- data/lib/clojure/core$create_struct__4282.class +0 -0
- data/lib/clojure/core$ctor_sigs__5565$iter__5567__5569$fn__5570.class +0 -0
- data/lib/clojure/core$ctor_sigs__5565$iter__5567__5569.class +0 -0
- data/lib/clojure/core$ctor_sigs__5565.class +0 -0
- data/lib/clojure/core$cycle__3899$fn__3901.class +0 -0
- data/lib/clojure/core$cycle__3899.class +0 -0
- data/lib/clojure/core$dec__3422.class +0 -0
- data/lib/clojure/core$decimal_QMARK___4121.class +0 -0
- data/lib/clojure/core$declare__5118$fn__5120.class +0 -0
- data/lib/clojure/core$declare__5118.class +0 -0
- data/lib/clojure/core$def_aset__4233.class +0 -0
- data/lib/clojure/core$definline__4716.class +0 -0
- data/lib/clojure/core$defmacro__3190.class +0 -0
- data/lib/clojure/core$defmethod__3641.class +0 -0
- data/lib/clojure/core$defmulti__3638.class +0 -0
- data/lib/clojure/core$defn__3158.class +0 -0
- data/lib/clojure/core$defn___4565.class +0 -0
- data/lib/clojure/core$defonce__4973.class +0 -0
- data/lib/clojure/core$defstruct__4285.class +0 -0
- data/lib/clojure/core$delay_QMARK___3278.class +0 -0
- data/lib/clojure/core$delay__3275.class +0 -0
- data/lib/clojure/core$deref__3725.class +0 -0
- data/lib/clojure/core$derive__4877$tf__4880$fn__4882.class +0 -0
- data/lib/clojure/core$derive__4877$tf__4880.class +0 -0
- data/lib/clojure/core$derive__4877.class +0 -0
- data/lib/clojure/core$descendants__4873.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4421$fn__4423.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4421.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4427.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419$fn__4430.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pmap__4419.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415$pvec__4416.class +0 -0
- data/lib/clojure/core$destructure__4413$pb__4415.class +0 -0
- data/lib/clojure/core$destructure__4413$process_entry__4436.class +0 -0
- data/lib/clojure/core$destructure__4413.class +0 -0
- data/lib/clojure/core$disj__3594.class +0 -0
- data/lib/clojure/core$dissoc__3589.class +0 -0
- data/lib/clojure/core$distinct_QMARK___4901.class +0 -0
- data/lib/clojure/core$distinct__4646$step__4648$fn__4649$fn__4652.class +0 -0
- data/lib/clojure/core$distinct__4646$step__4648$fn__4649.class +0 -0
- data/lib/clojure/core$distinct__4646$step__4648.class +0 -0
- data/lib/clojure/core$distinct__4646.class +0 -0
- data/lib/clojure/core$doall__4003.class +0 -0
- data/lib/clojure/core$doc__4590.class +0 -0
- data/lib/clojure/core$dorun__3998.class +0 -0
- data/lib/clojure/core$doseq__3993$step__3995.class +0 -0
- data/lib/clojure/core$doseq__3993.class +0 -0
- data/lib/clojure/core$dosync__4672.class +0 -0
- data/lib/clojure/core$dotimes__4025.class +0 -0
- data/lib/clojure/core$doto__4187$fn__4189.class +0 -0
- data/lib/clojure/core$doto__4187.class +0 -0
- data/lib/clojure/core$double__4077.class +0 -0
- data/lib/clojure/core$double_array__4742.class +0 -0
- data/lib/clojure/core$doubles__4790.class +0 -0
- data/lib/clojure/core$drop__3872$fn__3878.class +0 -0
- data/lib/clojure/core$drop__3872$step__3874.class +0 -0
- data/lib/clojure/core$drop__3872.class +0 -0
- data/lib/clojure/core$drop_last__3882$fn__3885.class +0 -0
- data/lib/clojure/core$drop_last__3882.class +0 -0
- data/lib/clojure/core$drop_while__3889$fn__3895.class +0 -0
- data/lib/clojure/core$drop_while__3889$step__3891.class +0 -0
- data/lib/clojure/core$drop_while__3889.class +0 -0
- data/lib/clojure/core$empty_QMARK___5084.class +0 -0
- data/lib/clojure/core$empty__4721.class +0 -0
- data/lib/clojure/core$ensure__3765.class +0 -0
- data/lib/clojure/core$enumeration_seq__4935.class +0 -0
- data/lib/clojure/core$escape_class_name__5576.class +0 -0
- data/lib/clojure/core$eval__3990.class +0 -0
- data/lib/clojure/core$eval__4760$fn__4762.class +0 -0
- data/lib/clojure/core$eval__4760.class +0 -0
- data/lib/clojure/core$eval__4772$fn__4774.class +0 -0
- data/lib/clojure/core$eval__4772.class +0 -0
- data/lib/clojure/core$eval__4784$fn__4786.class +0 -0
- data/lib/clojure/core$eval__4784.class +0 -0
- data/lib/clojure/core$eval__4796$fn__4798.class +0 -0
- data/lib/clojure/core$eval__4796.class +0 -0
- data/lib/clojure/core$even_QMARK___3545.class +0 -0
- data/lib/clojure/core$every_QMARK___3806.class +0 -0
- data/lib/clojure/core$false_QMARK___3202.class +0 -0
- data/lib/clojure/core$ffirst__3125.class +0 -0
- data/lib/clojure/core$file_seq__4601$fn__4603.class +0 -0
- data/lib/clojure/core$file_seq__4601$fn__4606.class +0 -0
- data/lib/clojure/core$file_seq__4601.class +0 -0
- data/lib/clojure/core$filter__3845$fn__3851.class +0 -0
- data/lib/clojure/core$filter__3845$step__3847.class +0 -0
- data/lib/clojure/core$filter__3845.class +0 -0
- data/lib/clojure/core$filter_key__4306.class +0 -0
- data/lib/clojure/core$find__3599.class +0 -0
- data/lib/clojure/core$find_doc__4571.class +0 -0
- data/lib/clojure/core$find_field__5583$fn__5585.class +0 -0
- data/lib/clojure/core$find_field__5583.class +0 -0
- data/lib/clojure/core$find_ns__4309.class +0 -0
- data/lib/clojure/core$find_var__3678.class +0 -0
- data/lib/clojure/core$first__3115.class +0 -0
- data/lib/clojure/core$float_QMARK___4124.class +0 -0
- data/lib/clojure/core$float__4071.class +0 -0
- data/lib/clojure/core$float_array__4735.class +0 -0
- data/lib/clojure/core$floats__4766.class +0 -0
- data/lib/clojure/core$flush__4156.class +0 -0
- data/lib/clojure/core$fn_QMARK___5099.class +0 -0
- data/lib/clojure/core$fn__3113.class +0 -0
- data/lib/clojure/core$fn__3288.class +0 -0
- data/lib/clojure/core$fn__3301.class +0 -0
- data/lib/clojure/core$fn__3329.class +0 -0
- data/lib/clojure/core$fn__3338.class +0 -0
- data/lib/clojure/core$fn__3347.class +0 -0
- data/lib/clojure/core$fn__3355.class +0 -0
- data/lib/clojure/core$fn__3363.class +0 -0
- data/lib/clojure/core$fn__3371.class +0 -0
- data/lib/clojure/core$fn__3379.class +0 -0
- data/lib/clojure/core$fn__3387.class +0 -0
- data/lib/clojure/core$fn__3395.class +0 -0
- data/lib/clojure/core$fn__3413.class +0 -0
- data/lib/clojure/core$fn__3419.class +0 -0
- data/lib/clojure/core$fn__3425.class +0 -0
- data/lib/clojure/core$fn__3431.class +0 -0
- data/lib/clojure/core$fn__3437.class +0 -0
- data/lib/clojure/core$fn__3443.class +0 -0
- data/lib/clojure/core$fn__3449.class +0 -0
- data/lib/clojure/core$fn__3455.class +0 -0
- data/lib/clojure/core$fn__3461.class +0 -0
- data/lib/clojure/core$fn__3467.class +0 -0
- data/lib/clojure/core$fn__3473.class +0 -0
- data/lib/clojure/core$fn__3479.class +0 -0
- data/lib/clojure/core$fn__3485.class +0 -0
- data/lib/clojure/core$fn__3500.class +0 -0
- data/lib/clojure/core$fn__3506.class +0 -0
- data/lib/clojure/core$fn__3512.class +0 -0
- data/lib/clojure/core$fn__3518.class +0 -0
- data/lib/clojure/core$fn__4050.class +0 -0
- data/lib/clojure/core$fn__4056.class +0 -0
- data/lib/clojure/core$fn__4062.class +0 -0
- data/lib/clojure/core$fn__4068.class +0 -0
- data/lib/clojure/core$fn__4074.class +0 -0
- data/lib/clojure/core$fn__4080.class +0 -0
- data/lib/clojure/core$fn__4086.class +0 -0
- data/lib/clojure/core$fn__4092.class +0 -0
- data/lib/clojure/core$fn__4098.class +0 -0
- data/lib/clojure/core$fn__4139.class +0 -0
- data/lib/clojure/core$fn__4142.class +0 -0
- data/lib/clojure/core$fn__4202.class +0 -0
- data/lib/clojure/core$fn__4208.class +0 -0
- data/lib/clojure/core$fn__4214.class +0 -0
- data/lib/clojure/core$fn__4221.class +0 -0
- data/lib/clojure/core$fn__4443$psig__4445.class +0 -0
- data/lib/clojure/core$fn__4443.class +0 -0
- data/lib/clojure/core$fn__4732.class +0 -0
- data/lib/clojure/core$fn__4739.class +0 -0
- data/lib/clojure/core$fn__4746.class +0 -0
- data/lib/clojure/core$fn__4753.class +0 -0
- data/lib/clojure/core$fn__4769.class +0 -0
- data/lib/clojure/core$fn__4781.class +0 -0
- data/lib/clojure/core$fn__4793.class +0 -0
- data/lib/clojure/core$fn__4805.class +0 -0
- data/lib/clojure/core$fn__4976.class +0 -0
- data/lib/clojure/core$fn__4980.class +0 -0
- data/lib/clojure/core$fn__4984.class +0 -0
- data/lib/clojure/core$fn__5379$fn__5381.class +0 -0
- data/lib/clojure/core$fn__5379.class +0 -0
- data/lib/clojure/core$fn__5385.class +0 -0
- data/lib/clojure/core$fn__5388.class +0 -0
- data/lib/clojure/core$fn__5394.class +0 -0
- data/lib/clojure/core$fn__5397.class +0 -0
- data/lib/clojure/core$fn__5400.class +0 -0
- data/lib/clojure/core$fn__5403.class +0 -0
- data/lib/clojure/core$fn__5406$fn__5408.class +0 -0
- data/lib/clojure/core$fn__5406.class +0 -0
- data/lib/clojure/core$fn__5412$fn__5414.class +0 -0
- data/lib/clojure/core$fn__5412.class +0 -0
- data/lib/clojure/core$fn__5418.class +0 -0
- data/lib/clojure/core$fn__5421.class +0 -0
- data/lib/clojure/core$fn__5427.class +0 -0
- data/lib/clojure/core$fn__5430.class +0 -0
- data/lib/clojure/core$fn__5433.class +0 -0
- data/lib/clojure/core$fn__5436.class +0 -0
- data/lib/clojure/core$fn__5439.class +0 -0
- data/lib/clojure/core$fn__5442.class +0 -0
- data/lib/clojure/core$fn__5445.class +0 -0
- data/lib/clojure/core$fn__5448.class +0 -0
- data/lib/clojure/core$fn__5453$fn__5455.class +0 -0
- data/lib/clojure/core$fn__5453.class +0 -0
- data/lib/clojure/core$fn__5459.class +0 -0
- data/lib/clojure/core$fn__5462.class +0 -0
- data/lib/clojure/core$fn__5467.class +0 -0
- data/lib/clojure/core$fn__5470.class +0 -0
- data/lib/clojure/core$fn__5479.class +0 -0
- data/lib/clojure/core$fn__5484$fn__5486.class +0 -0
- data/lib/clojure/core$fn__5484.class +0 -0
- data/lib/clojure/core$fn__5490.class +0 -0
- data/lib/clojure/core$fn__5493.class +0 -0
- data/lib/clojure/core$fn__5496.class +0 -0
- data/lib/clojure/core$fn__5500.class +0 -0
- data/lib/clojure/core$fn__5503.class +0 -0
- data/lib/clojure/core$fn__5506.class +0 -0
- data/lib/clojure/core$fn__5509.class +0 -0
- data/lib/clojure/core$fn__5512.class +0 -0
- data/lib/clojure/core$fn__5515.class +0 -0
- data/lib/clojure/core$fn__5518.class +0 -0
- data/lib/clojure/core$fn__5521.class +0 -0
- data/lib/clojure/core$fn__5524.class +0 -0
- data/lib/clojure/core$fn__5527.class +0 -0
- data/lib/clojure/core$fn__5530.class +0 -0
- data/lib/clojure/core$fn__5533.class +0 -0
- data/lib/clojure/core$fn__5536.class +0 -0
- data/lib/clojure/core$fn__5544.class +0 -0
- data/lib/clojure/core$fn__5547.class +0 -0
- data/lib/clojure/core$fn__5550.class +0 -0
- data/lib/clojure/core$fn__5774$prop__5777.class +0 -0
- data/lib/clojure/core$fn__5774.class +0 -0
- data/lib/clojure/core$fnext__3129.class +0 -0
- data/lib/clojure/core$for__4475$emit_bind__4489$do_mod__4495.class +0 -0
- data/lib/clojure/core$for__4475$emit_bind__4489.class +0 -0
- data/lib/clojure/core$for__4475$err__4485.class +0 -0
- data/lib/clojure/core$for__4475$to_groups__4477$fn__4480.class +0 -0
- data/lib/clojure/core$for__4475$to_groups__4477.class +0 -0
- data/lib/clojure/core$for__4475.class +0 -0
- data/lib/clojure/core$force__3281.class +0 -0
- data/lib/clojure/core$format__4938.class +0 -0
- data/lib/clojure/core$future__5722.class +0 -0
- data/lib/clojure/core$future_call__5702$fn__5704.class +0 -0
- data/lib/clojure/core$future_call__5702$fn__5707.class +0 -0
- data/lib/clojure/core$future_call__5702$fn__5710.class +0 -0
- data/lib/clojure/core$future_call__5702$fn__5713.class +0 -0
- data/lib/clojure/core$future_call__5702$fn__5717.class +0 -0
- data/lib/clojure/core$future_call__5702.class +0 -0
- data/lib/clojure/core$gen_class__5679.class +0 -0
- data/lib/clojure/core$gen_interface__5698.class +0 -0
- data/lib/clojure/core$generate_class__5596$arg_types__5608.class +0 -0
- data/lib/clojure/core$generate_class__5596$emit_forwarding_method__5642.class +0 -0
- data/lib/clojure/core$generate_class__5596$emit_get_var__5636.class +0 -0
- data/lib/clojure/core$generate_class__5596$emit_unsupported__5639.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5614.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5619.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5624.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5629$fn__5632.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5629.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5651.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5654.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5657.class +0 -0
- data/lib/clojure/core$generate_class__5596$fn__5664.class +0 -0
- data/lib/clojure/core$generate_class__5596$iname__5599.class +0 -0
- data/lib/clojure/core$generate_class__5596$to_types__5605.class +0 -0
- data/lib/clojure/core$generate_class__5596$totype__5602.class +0 -0
- data/lib/clojure/core$generate_class__5596$var_name__5611.class +0 -0
- data/lib/clojure/core$generate_class__5596.class +0 -0
- data/lib/clojure/core$generate_interface__5689$fn__5692.class +0 -0
- data/lib/clojure/core$generate_interface__5689.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5209$fn__5212.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5209.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5237.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5240.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5247.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$fn__5251.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$gen_bridge__5199.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$gen_method__5203.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$iname__5190.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226$iter__5223__5228$fn__5229.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226$iter__5223__5228.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$iter__5221__5225$fn__5226.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$iter__5221__5225.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$to_types__5196.class +0 -0
- data/lib/clojure/core$generate_proxy__5188$totype__5193.class +0 -0
- data/lib/clojure/core$generate_proxy__5188.class +0 -0
- data/lib/clojure/core$gensym__3233.class +0 -0
- data/lib/clojure/core$get__3585.class +0 -0
- data/lib/clojure/core$get_in__5071.class +0 -0
- data/lib/clojure/core$get_method__3653.class +0 -0
- data/lib/clojure/core$get_proxy_class__5259.class +0 -0
- data/lib/clojure/core$get_super_and_interfaces__5256.class +0 -0
- data/lib/clojure/core$get_validator__3747.class +0 -0
- data/lib/clojure/core$group_by_sig__5170$fn__5173.class +0 -0
- data/lib/clojure/core$group_by_sig__5170.class +0 -0
- data/lib/clojure/core$hash__4710.class +0 -0
- data/lib/clojure/core$hash_map__3173.class +0 -0
- data/lib/clojure/core$hash_set__3177.class +0 -0
- data/lib/clojure/core$identity__3566.class +0 -0
- data/lib/clojure/core$if_let__3663.class +0 -0
- data/lib/clojure/core$if_not__3284.class +0 -0
- data/lib/clojure/core$ifn_QMARK___5096.class +0 -0
- data/lib/clojure/core$import__4028.class +0 -0
- data/lib/clojure/core$inc__3416.class +0 -0
- data/lib/clojure/core$init_proxy__5268.class +0 -0
- data/lib/clojure/core$instance_QMARK___3135.class +0 -0
- data/lib/clojure/core$int__4059.class +0 -0
- data/lib/clojure/core$int_array__4749.class +0 -0
- data/lib/clojure/core$integer_QMARK___4107.class +0 -0
- data/lib/clojure/core$interleave__4383.class +0 -0
- data/lib/clojure/core$intern__5131.class +0 -0
- data/lib/clojure/core$interpose__4713.class +0 -0
- data/lib/clojure/core$into__4037.class +0 -0
- data/lib/clojure/core$into_array__4033.class +0 -0
- data/lib/clojure/core$ints__4778.class +0 -0
- data/lib/clojure/core$io_BANG___3771.class +0 -0
- data/lib/clojure/core$isa_QMARK___4843$fn__4846.class +0 -0
- data/lib/clojure/core$isa_QMARK___4843.class +0 -0
- data/lib/clojure/core$iterate__3922$fn__3924.class +0 -0
- data/lib/clojure/core$iterate__3922.class +0 -0
- data/lib/clojure/core$iterator_seq__4932.class +0 -0
- data/lib/clojure/core$key__3611.class +0 -0
- data/lib/clojure/core$keys__3605.class +0 -0
- data/lib/clojure/core$keyword_QMARK___3222.class +0 -0
- data/lib/clojure/core$keyword__3229.class +0 -0
- data/lib/clojure/core$last__3154.class +0 -0
- data/lib/clojure/core$lazy_cat__4466$fn__4468.class +0 -0
- data/lib/clojure/core$lazy_cat__4466.class +0 -0
- data/lib/clojure/core$lazy_seq__3252.class +0 -0
- data/lib/clojure/core$let__3109.class +0 -0
- data/lib/clojure/core$let__4440.class +0 -0
- data/lib/clojure/core$letfn__5768$fn__5770.class +0 -0
- data/lib/clojure/core$letfn__5768.class +0 -0
- data/lib/clojure/core$libspec_QMARK___4995.class +0 -0
- data/lib/clojure/core$line_seq__3959$fn__3961.class +0 -0
- data/lib/clojure/core$line_seq__3959.class +0 -0
- data/lib/clojure/core$list_QMARK___5090.class +0 -0
- data/lib/clojure/core$list_STAR___3249.class +0 -0
- data/lib/clojure/core$load__5058$fn__5061.class +0 -0
- data/lib/clojure/core$load__5058.class +0 -0
- data/lib/clojure/core$load_all__5019$fn__5021$fn__5023.class +0 -0
- data/lib/clojure/core$load_all__5019$fn__5021$fn__5026.class +0 -0
- data/lib/clojure/core$load_all__5019$fn__5021.class +0 -0
- data/lib/clojure/core$load_all__5019.class +0 -0
- data/lib/clojure/core$load_lib__5031.class +0 -0
- data/lib/clojure/core$load_libs__5043.class +0 -0
- data/lib/clojure/core$load_one__5010$fn__5012.class +0 -0
- data/lib/clojure/core$load_one__5010.class +0 -0
- data/lib/clojure/core$load_reader__4297.class +0 -0
- data/lib/clojure/core$load_string__4300.class +0 -0
- data/lib/clojure/core$loaded_libs__5055.class +0 -0
- data/lib/clojure/core$locking__3627.class +0 -0
- data/lib/clojure/core$long__4065.class +0 -0
- data/lib/clojure/core$long_array__4756.class +0 -0
- data/lib/clojure/core$longs__4802.class +0 -0
- data/lib/clojure/core$loop__3111.class +0 -0
- data/lib/clojure/core$loop__4450$fn__4452.class +0 -0
- data/lib/clojure/core$loop__4450$fn__4456.class +0 -0
- data/lib/clojure/core$loop__4450.class +0 -0
- data/lib/clojure/core$macroexpand_1__4276.class +0 -0
- data/lib/clojure/core$macroexpand__4279.class +0 -0
- data/lib/clojure/core$make_array__4268.class +0 -0
- data/lib/clojure/core$make_hierarchy__4830.class +0 -0
- data/lib/clojure/core$map_QMARK___3141.class +0 -0
- data/lib/clojure/core$map__3815$fn__3817.class +0 -0
- data/lib/clojure/core$map__3815$fn__3822.class +0 -0
- data/lib/clojure/core$map__3815$fn__3827.class +0 -0
- data/lib/clojure/core$map__3815$fn__3838.class +0 -0
- data/lib/clojure/core$map__3815$step__3833$fn__3834.class +0 -0
- data/lib/clojure/core$map__3815$step__3833.class +0 -0
- data/lib/clojure/core$map__3815.class +0 -0
- data/lib/clojure/core$mapcat__3842.class +0 -0
- data/lib/clojure/core$max__3403.class +0 -0
- data/lib/clojure/core$max_key__4628$fn__4632.class +0 -0
- data/lib/clojure/core$max_key__4628.class +0 -0
- data/lib/clojure/core$memfn__4194.class +0 -0
- data/lib/clojure/core$memoize__5138$fn__5140.class +0 -0
- data/lib/clojure/core$memoize__5138.class +0 -0
- data/lib/clojure/core$merge__3938$fn__3940.class +0 -0
- data/lib/clojure/core$merge__3938.class +0 -0
- data/lib/clojure/core$merge_with__3945$merge2__3950.class +0 -0
- data/lib/clojure/core$merge_with__3945$merge_entry__3947.class +0 -0
- data/lib/clojure/core$merge_with__3945.class +0 -0
- data/lib/clojure/core$meta__3150.class +0 -0
- data/lib/clojure/core$method_sig__5156.class +0 -0
- data/lib/clojure/core$methods__3650.class +0 -0
- data/lib/clojure/core$min__3408.class +0 -0
- data/lib/clojure/core$min_key__4638$fn__4642.class +0 -0
- data/lib/clojure/core$min_key__4638.class +0 -0
- data/lib/clojure/core$mod__4114.class +0 -0
- data/lib/clojure/core$most_specific__5160$fn__5162$fn__5164.class +0 -0
- data/lib/clojure/core$most_specific__5160$fn__5162.class +0 -0
- data/lib/clojure/core$most_specific__5160.class +0 -0
- data/lib/clojure/core$name__3620.class +0 -0
- data/lib/clojure/core$namespace__3623.class +0 -0
- data/lib/clojure/core$neg_QMARK___3482.class +0 -0
- data/lib/clojure/core$newline__4153.class +0 -0
- data/lib/clojure/core$next__3117.class +0 -0
- data/lib/clojure/core$nfirst__3127.class +0 -0
- data/lib/clojure/core$nil_QMARK___3199.class +0 -0
- data/lib/clojure/core$nnext__3131.class +0 -0
- data/lib/clojure/core$non_private_methods__5553$fn__5556.class +0 -0
- data/lib/clojure/core$non_private_methods__5553.class +0 -0
- data/lib/clojure/core$not_EQ___3296.class +0 -0
- data/lib/clojure/core$not__3208.class +0 -0
- data/lib/clojure/core$not_empty__4833.class +0 -0
- data/lib/clojure/core$ns__4948$fn__4958.class +0 -0
- data/lib/clojure/core$ns__4948$fn__4961.class +0 -0
- data/lib/clojure/core$ns__4948$fn__4964.class +0 -0
- data/lib/clojure/core$ns__4948$process_reference__4951$fn__4954.class +0 -0
- data/lib/clojure/core$ns__4948$process_reference__4951.class +0 -0
- data/lib/clojure/core$ns__4948.class +0 -0
- data/lib/clojure/core$ns_aliases__4370.class +0 -0
- data/lib/clojure/core$ns_imports__4342.class +0 -0
- data/lib/clojure/core$ns_interns__4360$fn__4362.class +0 -0
- data/lib/clojure/core$ns_interns__4360.class +0 -0
- data/lib/clojure/core$ns_map__4328.class +0 -0
- data/lib/clojure/core$ns_name__4325.class +0 -0
- data/lib/clojure/core$ns_publics__4334$fn__4336.class +0 -0
- data/lib/clojure/core$ns_publics__4334.class +0 -0
- data/lib/clojure/core$ns_refers__4353$fn__4355.class +0 -0
- data/lib/clojure/core$ns_refers__4353.class +0 -0
- data/lib/clojure/core$ns_resolve__4395.class +0 -0
- data/lib/clojure/core$ns_unalias__4373.class +0 -0
- data/lib/clojure/core$ns_unmap__4331.class +0 -0
- data/lib/clojure/core$nth__3578.class +0 -0
- data/lib/clojure/core$nthnext__4405.class +0 -0
- data/lib/clojure/core$num__4053.class +0 -0
- data/lib/clojure/core$number_QMARK___4104.class +0 -0
- data/lib/clojure/core$odd_QMARK___3548.class +0 -0
- data/lib/clojure/core$or__3314.class +0 -0
- data/lib/clojure/core$overload_name__5579.class +0 -0
- data/lib/clojure/core$parents__4861.class +0 -0
- data/lib/clojure/core$partial__3781$fn__3783.class +0 -0
- data/lib/clojure/core$partial__3781$fn__3787.class +0 -0
- data/lib/clojure/core$partial__3781$fn__3791.class +0 -0
- data/lib/clojure/core$partial__3781$fn__3795.class +0 -0
- data/lib/clojure/core$partial__3781.class +0 -0
- data/lib/clojure/core$partition__3982$fn__3985.class +0 -0
- data/lib/clojure/core$partition__3982.class +0 -0
- data/lib/clojure/core$pcalls__5754$fn__5756.class +0 -0
- data/lib/clojure/core$pcalls__5754.class +0 -0
- data/lib/clojure/core$peek__3572.class +0 -0
- data/lib/clojure/core$pmap__5727$fn__5729$fn__5731.class +0 -0
- data/lib/clojure/core$pmap__5727$fn__5729.class +0 -0
- data/lib/clojure/core$pmap__5727$fn__5749.class +0 -0
- data/lib/clojure/core$pmap__5727$step__5736$fn__5738.class +0 -0
- data/lib/clojure/core$pmap__5727$step__5736.class +0 -0
- data/lib/clojure/core$pmap__5727$step__5744$fn__5745.class +0 -0
- data/lib/clojure/core$pmap__5727$step__5744.class +0 -0
- data/lib/clojure/core$pmap__5727.class +0 -0
- data/lib/clojure/core$pop__3575.class +0 -0
- data/lib/clojure/core$pos_QMARK___3476.class +0 -0
- data/lib/clojure/core$pr__4148.class +0 -0
- data/lib/clojure/core$pr_on__4145.class +0 -0
- data/lib/clojure/core$pr_str__4512.class +0 -0
- data/lib/clojure/core$prefer_method__3647.class +0 -0
- data/lib/clojure/core$prefers__3656.class +0 -0
- data/lib/clojure/core$prependss__5001.class +0 -0
- data/lib/clojure/core$print__4162.class +0 -0
- data/lib/clojure/core$print_ctor__5391.class +0 -0
- data/lib/clojure/core$print_doc__4568.class +0 -0
- data/lib/clojure/core$print_map__5473$fn__5475.class +0 -0
- data/lib/clojure/core$print_map__5473.class +0 -0
- data/lib/clojure/core$print_meta__5370.class +0 -0
- data/lib/clojure/core$print_namespace_doc__4587.class +0 -0
- data/lib/clojure/core$print_sequential__5354.class +0 -0
- data/lib/clojure/core$print_simple__5424.class +0 -0
- data/lib/clojure/core$print_special_doc__4584.class +0 -0
- data/lib/clojure/core$print_str__4520.class +0 -0
- data/lib/clojure/core$printf__4941.class +0 -0
- data/lib/clojure/core$println__4165.class +0 -0
- data/lib/clojure/core$println_str__4524.class +0 -0
- data/lib/clojure/core$prn__4159.class +0 -0
- data/lib/clojure/core$prn_str__4516.class +0 -0
- data/lib/clojure/core$proxy__5279$fn__5282.class +0 -0
- data/lib/clojure/core$proxy__5279$fn__5287$fn__5291.class +0 -0
- data/lib/clojure/core$proxy__5279$fn__5287.class +0 -0
- data/lib/clojure/core$proxy__5279.class +0 -0
- data/lib/clojure/core$proxy_call_with_super__5297.class +0 -0
- data/lib/clojure/core$proxy_mappings__5274.class +0 -0
- data/lib/clojure/core$proxy_name__5179$fn__5181.class +0 -0
- data/lib/clojure/core$proxy_name__5179.class +0 -0
- data/lib/clojure/core$proxy_super__5300.class +0 -0
- data/lib/clojure/core$pvalues__5761$fn__5763.class +0 -0
- data/lib/clojure/core$pvalues__5761.class +0 -0
- data/lib/clojure/core$quot__3491.class +0 -0
- data/lib/clojure/core$rand__4558.class +0 -0
- data/lib/clojure/core$rand_int__4562.class +0 -0
- data/lib/clojure/core$range__3928.class +0 -0
- data/lib/clojure/core$ratio_QMARK___4118.class +0 -0
- data/lib/clojure/core$rational_QMARK___4128.class +0 -0
- data/lib/clojure/core$rationalize__3497.class +0 -0
- data/lib/clojure/core$re_find__4554.class +0 -0
- data/lib/clojure/core$re_groups__4540.class +0 -0
- data/lib/clojure/core$re_matcher__4537.class +0 -0
- data/lib/clojure/core$re_matches__4551.class +0 -0
- data/lib/clojure/core$re_pattern__4534.class +0 -0
- data/lib/clojure/core$re_seq__4543$step__4545$fn__4546.class +0 -0
- data/lib/clojure/core$re_seq__4543$step__4545.class +0 -0
- data/lib/clojure/core$re_seq__4543.class +0 -0
- data/lib/clojure/core$read__4168.class +0 -0
- data/lib/clojure/core$read_line__4174.class +0 -0
- data/lib/clojure/core$read_string__4177.class +0 -0
- data/lib/clojure/core$reduce__3319$fn__3322.class +0 -0
- data/lib/clojure/core$reduce__3319.class +0 -0
- data/lib/clojure/core$ref__3721.class +0 -0
- data/lib/clojure/core$ref_set__3762.class +0 -0
- data/lib/clojure/core$refer__4345.class +0 -0
- data/lib/clojure/core$refer_clojure__4969.class +0 -0
- data/lib/clojure/core$release_pending_sends__3694.class +0 -0
- data/lib/clojure/core$rem__3494.class +0 -0
- data/lib/clojure/core$remove__3855.class +0 -0
- data/lib/clojure/core$remove_method__3644.class +0 -0
- data/lib/clojure/core$remove_ns__4315.class +0 -0
- data/lib/clojure/core$remove_watch__3700.class +0 -0
- data/lib/clojure/core$remove_watcher__3709.class +0 -0
- data/lib/clojure/core$repeat__3912$fn__3914.class +0 -0
- data/lib/clojure/core$repeat__3912.class +0 -0
- data/lib/clojure/core$repeatedly__4701$fn__4703.class +0 -0
- data/lib/clojure/core$repeatedly__4701.class +0 -0
- data/lib/clojure/core$replace__4661$fn__4663.class +0 -0
- data/lib/clojure/core$replace__4661$fn__4667.class +0 -0
- data/lib/clojure/core$replace__4661.class +0 -0
- data/lib/clojure/core$replicate__3919.class +0 -0
- data/lib/clojure/core$require__5049.class +0 -0
- data/lib/clojure/core$reset_BANG___3741.class +0 -0
- data/lib/clojure/core$reset_meta_BANG___3753.class +0 -0
- data/lib/clojure/core$resolve__4398.class +0 -0
- data/lib/clojure/core$rest__3119.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$fn__4913.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$fn__4916.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$row_values__4919$fn__4921.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$row_values__4919.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$thisfn__4925$fn__4926.class +0 -0
- data/lib/clojure/core$resultset_seq__4911$thisfn__4925.class +0 -0
- data/lib/clojure/core$resultset_seq__4911.class +0 -0
- data/lib/clojure/core$reverse__3326.class +0 -0
- data/lib/clojure/core$reversible_QMARK___5114.class +0 -0
- data/lib/clojure/core$root_directory__5007.class +0 -0
- data/lib/clojure/core$root_resource__5004.class +0 -0
- data/lib/clojure/core$rseq__3617.class +0 -0
- data/lib/clojure/core$rsubseq__4693.class +0 -0
- data/lib/clojure/core$second__3123.class +0 -0
- data/lib/clojure/core$select_keys__3602.class +0 -0
- data/lib/clojure/core$send__3688.class +0 -0
- data/lib/clojure/core$send_off__3691.class +0 -0
- data/lib/clojure/core$seq_QMARK___3137.class +0 -0
- data/lib/clojure/core$seq__3133.class +0 -0
- data/lib/clojure/core$seque__4808$drain__4818$fn__4819.class +0 -0
- data/lib/clojure/core$seque__4808$drain__4818.class +0 -0
- data/lib/clojure/core$seque__4808$fill__4811.class +0 -0
- data/lib/clojure/core$seque__4808.class +0 -0
- data/lib/clojure/core$sequence__3802.class +0 -0
- data/lib/clojure/core$sequential_QMARK___5105.class +0 -0
- data/lib/clojure/core$set_QMARK___5093.class +0 -0
- data/lib/clojure/core$set__4303.class +0 -0
- data/lib/clojure/core$set_validator_BANG___3744.class +0 -0
- data/lib/clojure/core$setup_reference__3681.class +0 -0
- data/lib/clojure/core$short__4083.class +0 -0
- data/lib/clojure/core$shutdown_agents__3718.class +0 -0
- data/lib/clojure/core$sigs__3145.class +0 -0
- data/lib/clojure/core$slurp__4619.class +0 -0
- data/lib/clojure/core$some__3810.class +0 -0
- data/lib/clojure/core$sort__3971.class +0 -0
- data/lib/clojure/core$sort_by__3975$fn__3978.class +0 -0
- data/lib/clojure/core$sort_by__3975.class +0 -0
- data/lib/clojure/core$sorted_QMARK___5108.class +0 -0
- data/lib/clojure/core$sorted_map__3181.class +0 -0
- data/lib/clojure/core$sorted_map_by__3187.class +0 -0
- data/lib/clojure/core$sorted_set__3184.class +0 -0
- data/lib/clojure/core$special_form_anchor__4578.class +0 -0
- data/lib/clojure/core$special_symbol_QMARK___4613.class +0 -0
- data/lib/clojure/core$split_at__3906.class +0 -0
- data/lib/clojure/core$split_with__3909.class +0 -0
- data/lib/clojure/core$spread__3240.class +0 -0
- data/lib/clojure/core$str__3211$fn__3215.class +0 -0
- data/lib/clojure/core$str__3211.class +0 -0
- data/lib/clojure/core$stream_QMARK___3799.class +0 -0
- data/lib/clojure/core$string_QMARK___3139.class +0 -0
- data/lib/clojure/core$struct__4291.class +0 -0
- data/lib/clojure/core$struct_map__4288.class +0 -0
- data/lib/clojure/core$subs__4622.class +0 -0
- data/lib/clojure/core$subseq__4685.class +0 -0
- data/lib/clojure/core$subvec__4180.class +0 -0
- data/lib/clojure/core$supers__4839.class +0 -0
- data/lib/clojure/core$swap_BANG___3732.class +0 -0
- data/lib/clojure/core$symbol_QMARK___3219.class +0 -0
- data/lib/clojure/core$symbol__3225.class +0 -0
- data/lib/clojure/core$sync__3768.class +0 -0
- data/lib/clojure/core$syntax_symbol_anchor__4581.class +0 -0
- data/lib/clojure/core$take__3858$fn__3860.class +0 -0
- data/lib/clojure/core$take__3858.class +0 -0
- data/lib/clojure/core$take_nth__4376$fn__4378.class +0 -0
- data/lib/clojure/core$take_nth__4376.class +0 -0
- data/lib/clojure/core$take_while__3865$fn__3867.class +0 -0
- data/lib/clojure/core$take_while__3865.class +0 -0
- data/lib/clojure/core$test__4531.class +0 -0
- data/lib/clojure/core$the_class__5590.class +0 -0
- data/lib/clojure/core$the_ns__4321.class +0 -0
- data/lib/clojure/core$throw_if__4989$boring_QMARK___4991.class +0 -0
- data/lib/clojure/core$throw_if__4989.class +0 -0
- data/lib/clojure/core$time__4199.class +0 -0
- data/lib/clojure/core$to_array_2d__4273.class +0 -0
- data/lib/clojure/core$to_array__3163.class +0 -0
- data/lib/clojure/core$trampoline__5124$fn__5127.class +0 -0
- data/lib/clojure/core$trampoline__5124.class +0 -0
- data/lib/clojure/core$tree_seq__4593$walk__4595$fn__4596.class +0 -0
- data/lib/clojure/core$tree_seq__4593$walk__4595.class +0 -0
- data/lib/clojure/core$tree_seq__4593.class +0 -0
- data/lib/clojure/core$true_QMARK___3205.class +0 -0
- data/lib/clojure/core$type__4046.class +0 -0
- data/lib/clojure/core$unchecked_add__3446.class +0 -0
- data/lib/clojure/core$unchecked_dec__3434.class +0 -0
- data/lib/clojure/core$unchecked_divide__3464.class +0 -0
- data/lib/clojure/core$unchecked_inc__3428.class +0 -0
- data/lib/clojure/core$unchecked_multiply__3458.class +0 -0
- data/lib/clojure/core$unchecked_negate__3440.class +0 -0
- data/lib/clojure/core$unchecked_remainder__3470.class +0 -0
- data/lib/clojure/core$unchecked_subtract__3452.class +0 -0
- data/lib/clojure/core$underive__4891$tf__4894$fn__4896.class +0 -0
- data/lib/clojure/core$underive__4891$tf__4894.class +0 -0
- data/lib/clojure/core$underive__4891.class +0 -0
- data/lib/clojure/core$update_in__5080.class +0 -0
- data/lib/clojure/core$update_proxy__5271.class +0 -0
- data/lib/clojure/core$use__5052.class +0 -0
- data/lib/clojure/core$val__3614.class +0 -0
- data/lib/clojure/core$vals__3608.class +0 -0
- data/lib/clojure/core$var_QMARK___4616.class +0 -0
- data/lib/clojure/core$var_get__4386.class +0 -0
- data/lib/clojure/core$var_set__4389.class +0 -0
- data/lib/clojure/core$vary_meta__3246.class +0 -0
- data/lib/clojure/core$vec__3170.class +0 -0
- data/lib/clojure/core$vector_QMARK___3143.class +0 -0
- data/lib/clojure/core$vector__3166.class +0 -0
- data/lib/clojure/core$when__3193.class +0 -0
- data/lib/clojure/core$when_first__4461.class +0 -0
- data/lib/clojure/core$when_let__3669.class +0 -0
- data/lib/clojure/core$when_not__3196.class +0 -0
- data/lib/clojure/core$while__5135.class +0 -0
- data/lib/clojure/core$with_in_str__4509.class +0 -0
- data/lib/clojure/core$with_local_vars__4392.class +0 -0
- data/lib/clojure/core$with_meta__3152.class +0 -0
- data/lib/clojure/core$with_open__4184.class +0 -0
- data/lib/clojure/core$with_out_str__4505.class +0 -0
- data/lib/clojure/core$with_precision__4675.class +0 -0
- data/lib/clojure/core$xml_seq__4610.class +0 -0
- data/lib/clojure/core$zero_QMARK___3488.class +0 -0
- data/lib/clojure/core$zipmap__3955.class +0 -0
- data/lib/clojure/core.clj +4121 -0
- data/lib/clojure/core__init.class +0 -0
- data/lib/clojure/core_print.clj +317 -0
- data/lib/clojure/core_print__init.class +0 -0
- data/lib/clojure/core_proxy.clj +394 -0
- data/lib/clojure/core_proxy__init.class +0 -0
- data/lib/clojure/genclass.clj +683 -0
- data/lib/clojure/genclass__init.class +0 -0
- data/lib/clojure/inspector$atom_QMARK___6181.class +0 -0
- data/lib/clojure/inspector$collection_tag__6184.class +0 -0
- data/lib/clojure/inspector$fn__6187.class +0 -0
- data/lib/clojure/inspector$fn__6190.class +0 -0
- data/lib/clojure/inspector$fn__6193.class +0 -0
- data/lib/clojure/inspector$fn__6196.class +0 -0
- data/lib/clojure/inspector$fn__6199.class +0 -0
- data/lib/clojure/inspector$fn__6202.class +0 -0
- data/lib/clojure/inspector$fn__6205.class +0 -0
- data/lib/clojure/inspector$fn__6208.class +0 -0
- data/lib/clojure/inspector$fn__6211.class +0 -0
- data/lib/clojure/inspector$fn__6278$fn__6280.class +0 -0
- data/lib/clojure/inspector$fn__6278$fn__6283.class +0 -0
- data/lib/clojure/inspector$fn__6278.class +0 -0
- data/lib/clojure/inspector$fn__6287$fn__6289.class +0 -0
- data/lib/clojure/inspector$fn__6287$fn__6292.class +0 -0
- data/lib/clojure/inspector$fn__6287.class +0 -0
- data/lib/clojure/inspector$fn__6296$fn__6299.class +0 -0
- data/lib/clojure/inspector$fn__6296$fn__6303.class +0 -0
- data/lib/clojure/inspector$fn__6296$fn__6306.class +0 -0
- data/lib/clojure/inspector$fn__6296.class +0 -0
- data/lib/clojure/inspector$fn__6324$fn__6326.class +0 -0
- data/lib/clojure/inspector$fn__6324$fn__6329.class +0 -0
- data/lib/clojure/inspector$fn__6324$fn__6332.class +0 -0
- data/lib/clojure/inspector$fn__6324.class +0 -0
- data/lib/clojure/inspector$inspect__6337.class +0 -0
- data/lib/clojure/inspector$inspect_table__6274.class +0 -0
- data/lib/clojure/inspector$inspect_tree__6270.class +0 -0
- data/lib/clojure/inspector$list_model__6310$fn__6313.class +0 -0
- data/lib/clojure/inspector$list_model__6310$fn__6316.class +0 -0
- data/lib/clojure/inspector$list_model__6310$fn__6319.class +0 -0
- data/lib/clojure/inspector$list_model__6310.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6244.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6247.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6250.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6253.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6256.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6259.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6262.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242$fn__6265.class +0 -0
- data/lib/clojure/inspector$old_table_model__6242.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6216.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6219.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6222.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6225.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6228.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6231.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6234.class +0 -0
- data/lib/clojure/inspector$tree_model__6214$fn__6237.class +0 -0
- data/lib/clojure/inspector$tree_model__6214.class +0 -0
- data/lib/clojure/inspector.clj +180 -0
- data/lib/clojure/inspector__init.class +0 -0
- data/lib/clojure/lang/AFn.class +0 -0
- data/lib/clojure/lang/AFunction.class +0 -0
- data/lib/clojure/lang/AMapEntry.class +0 -0
- data/lib/clojure/lang/APersistentMap$1.class +0 -0
- data/lib/clojure/lang/APersistentMap$2$1.class +0 -0
- data/lib/clojure/lang/APersistentMap$2.class +0 -0
- data/lib/clojure/lang/APersistentMap$3$1.class +0 -0
- data/lib/clojure/lang/APersistentMap$3.class +0 -0
- data/lib/clojure/lang/APersistentMap$KeySeq.class +0 -0
- data/lib/clojure/lang/APersistentMap$ValSeq.class +0 -0
- data/lib/clojure/lang/APersistentMap.class +0 -0
- data/lib/clojure/lang/APersistentSet.class +0 -0
- data/lib/clojure/lang/APersistentVector$1.class +0 -0
- data/lib/clojure/lang/APersistentVector$2.class +0 -0
- data/lib/clojure/lang/APersistentVector$RSeq.class +0 -0
- data/lib/clojure/lang/APersistentVector$Seq.class +0 -0
- data/lib/clojure/lang/APersistentVector$Src.class +0 -0
- data/lib/clojure/lang/APersistentVector$SubVector.class +0 -0
- data/lib/clojure/lang/APersistentVector.class +0 -0
- data/lib/clojure/lang/ARef.class +0 -0
- data/lib/clojure/lang/AReference.class +0 -0
- data/lib/clojure/lang/ASeq$Src.class +0 -0
- data/lib/clojure/lang/ASeq.class +0 -0
- data/lib/clojure/lang/Agent$Action.class +0 -0
- data/lib/clojure/lang/Agent.class +0 -0
- data/lib/clojure/lang/ArraySeq$ArraySeq_double.class +0 -0
- data/lib/clojure/lang/ArraySeq$ArraySeq_float.class +0 -0
- data/lib/clojure/lang/ArraySeq$ArraySeq_int.class +0 -0
- data/lib/clojure/lang/ArraySeq$ArraySeq_long.class +0 -0
- data/lib/clojure/lang/ArraySeq.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_boolean.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_byte.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_char.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_double.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_float.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_int.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_long.class +0 -0
- data/lib/clojure/lang/ArrayStream$ArrayStream_short.class +0 -0
- data/lib/clojure/lang/ArrayStream.class +0 -0
- data/lib/clojure/lang/Associative.class +0 -0
- data/lib/clojure/lang/Atom.class +0 -0
- data/lib/clojure/lang/Binding.class +0 -0
- data/lib/clojure/lang/Box.class +0 -0
- data/lib/clojure/lang/Compile.class +0 -0
- data/lib/clojure/lang/Compiler$1.class +0 -0
- data/lib/clojure/lang/Compiler$AssignExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$AssignExpr.class +0 -0
- data/lib/clojure/lang/Compiler$AssignableExpr.class +0 -0
- data/lib/clojure/lang/Compiler$BindingInit.class +0 -0
- data/lib/clojure/lang/Compiler$BodyExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$BodyExpr.class +0 -0
- data/lib/clojure/lang/Compiler$BooleanExpr.class +0 -0
- data/lib/clojure/lang/Compiler$C.class +0 -0
- data/lib/clojure/lang/Compiler$CompilerException.class +0 -0
- data/lib/clojure/lang/Compiler$ConstantExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$ConstantExpr.class +0 -0
- data/lib/clojure/lang/Compiler$DefExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$DefExpr.class +0 -0
- data/lib/clojure/lang/Compiler$EmptyExpr.class +0 -0
- data/lib/clojure/lang/Compiler$Expr.class +0 -0
- data/lib/clojure/lang/Compiler$FieldExpr.class +0 -0
- data/lib/clojure/lang/Compiler$FnExpr.class +0 -0
- data/lib/clojure/lang/Compiler$FnLoaderThunk.class +0 -0
- data/lib/clojure/lang/Compiler$FnMethod.class +0 -0
- data/lib/clojure/lang/Compiler$HostExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$HostExpr.class +0 -0
- data/lib/clojure/lang/Compiler$IParser.class +0 -0
- data/lib/clojure/lang/Compiler$IfExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$IfExpr.class +0 -0
- data/lib/clojure/lang/Compiler$InstanceFieldExpr.class +0 -0
- data/lib/clojure/lang/Compiler$InstanceMethodExpr.class +0 -0
- data/lib/clojure/lang/Compiler$InvokeExpr.class +0 -0
- data/lib/clojure/lang/Compiler$KeywordExpr.class +0 -0
- data/lib/clojure/lang/Compiler$LetExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$LetExpr.class +0 -0
- data/lib/clojure/lang/Compiler$LetFnExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$LetFnExpr.class +0 -0
- data/lib/clojure/lang/Compiler$ListExpr.class +0 -0
- data/lib/clojure/lang/Compiler$LiteralExpr.class +0 -0
- data/lib/clojure/lang/Compiler$LocalBinding.class +0 -0
- data/lib/clojure/lang/Compiler$LocalBindingExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MapExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MaybePrimitiveExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MetaExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MethodExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MonitorEnterExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$MonitorEnterExpr.class +0 -0
- data/lib/clojure/lang/Compiler$MonitorExitExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$MonitorExitExpr.class +0 -0
- data/lib/clojure/lang/Compiler$NewExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$NewExpr.class +0 -0
- data/lib/clojure/lang/Compiler$NilExpr.class +0 -0
- data/lib/clojure/lang/Compiler$PSTATE.class +0 -0
- data/lib/clojure/lang/Compiler$RecurExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$RecurExpr.class +0 -0
- data/lib/clojure/lang/Compiler$SetExpr.class +0 -0
- data/lib/clojure/lang/Compiler$SourceDebugExtensionAttribute.class +0 -0
- data/lib/clojure/lang/Compiler$StaticFieldExpr.class +0 -0
- data/lib/clojure/lang/Compiler$StaticMethodExpr.class +0 -0
- data/lib/clojure/lang/Compiler$StringExpr.class +0 -0
- data/lib/clojure/lang/Compiler$TheVarExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$TheVarExpr.class +0 -0
- data/lib/clojure/lang/Compiler$ThrowExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$ThrowExpr.class +0 -0
- data/lib/clojure/lang/Compiler$TryExpr$CatchClause.class +0 -0
- data/lib/clojure/lang/Compiler$TryExpr$Parser.class +0 -0
- data/lib/clojure/lang/Compiler$TryExpr.class +0 -0
- data/lib/clojure/lang/Compiler$UnresolvedVarExpr.class +0 -0
- data/lib/clojure/lang/Compiler$UntypedExpr.class +0 -0
- data/lib/clojure/lang/Compiler$VarExpr.class +0 -0
- data/lib/clojure/lang/Compiler$VectorExpr.class +0 -0
- data/lib/clojure/lang/Compiler.class +0 -0
- data/lib/clojure/lang/Cons.class +0 -0
- data/lib/clojure/lang/Counted.class +0 -0
- data/lib/clojure/lang/Delay.class +0 -0
- data/lib/clojure/lang/DynamicClassLoader.class +0 -0
- data/lib/clojure/lang/EnumerationSeq$State.class +0 -0
- data/lib/clojure/lang/EnumerationSeq.class +0 -0
- data/lib/clojure/lang/Fn.class +0 -0
- data/lib/clojure/lang/IDeref.class +0 -0
- data/lib/clojure/lang/IFn.class +0 -0
- data/lib/clojure/lang/IMapEntry.class +0 -0
- data/lib/clojure/lang/IMeta.class +0 -0
- data/lib/clojure/lang/IObj.class +0 -0
- data/lib/clojure/lang/IPersistentCollection.class +0 -0
- data/lib/clojure/lang/IPersistentList.class +0 -0
- data/lib/clojure/lang/IPersistentMap.class +0 -0
- data/lib/clojure/lang/IPersistentSet.class +0 -0
- data/lib/clojure/lang/IPersistentStack.class +0 -0
- data/lib/clojure/lang/IPersistentVector.class +0 -0
- data/lib/clojure/lang/IProxy.class +0 -0
- data/lib/clojure/lang/IReduce.class +0 -0
- data/lib/clojure/lang/IRef.class +0 -0
- data/lib/clojure/lang/IReference.class +0 -0
- data/lib/clojure/lang/ISeq.class +0 -0
- data/lib/clojure/lang/IndexedSeq.class +0 -0
- data/lib/clojure/lang/IteratorSeq$State.class +0 -0
- data/lib/clojure/lang/IteratorSeq.class +0 -0
- data/lib/clojure/lang/IteratorStream.class +0 -0
- data/lib/clojure/lang/Keyword.class +0 -0
- data/lib/clojure/lang/LazilyPersistentVector.class +0 -0
- data/lib/clojure/lang/LazySeq.class +0 -0
- data/lib/clojure/lang/LineNumberingPushbackReader.class +0 -0
- data/lib/clojure/lang/LispReader$ArgReader.class +0 -0
- data/lib/clojure/lang/LispReader$CharacterReader.class +0 -0
- data/lib/clojure/lang/LispReader$CommentReader.class +0 -0
- data/lib/clojure/lang/LispReader$CtorReader.class +0 -0
- data/lib/clojure/lang/LispReader$DiscardReader.class +0 -0
- data/lib/clojure/lang/LispReader$DispatchReader.class +0 -0
- data/lib/clojure/lang/LispReader$EvalReader.class +0 -0
- data/lib/clojure/lang/LispReader$FnReader.class +0 -0
- data/lib/clojure/lang/LispReader$ListReader.class +0 -0
- data/lib/clojure/lang/LispReader$MapReader.class +0 -0
- data/lib/clojure/lang/LispReader$MetaReader.class +0 -0
- data/lib/clojure/lang/LispReader$ReaderException.class +0 -0
- data/lib/clojure/lang/LispReader$RegexReader.class +0 -0
- data/lib/clojure/lang/LispReader$SetReader.class +0 -0
- data/lib/clojure/lang/LispReader$StringReader.class +0 -0
- data/lib/clojure/lang/LispReader$SyntaxQuoteReader.class +0 -0
- data/lib/clojure/lang/LispReader$UnmatchedDelimiterReader.class +0 -0
- data/lib/clojure/lang/LispReader$UnquoteReader.class +0 -0
- data/lib/clojure/lang/LispReader$UnreadableReader.class +0 -0
- data/lib/clojure/lang/LispReader$VarReader.class +0 -0
- data/lib/clojure/lang/LispReader$VectorReader.class +0 -0
- data/lib/clojure/lang/LispReader$WrappingReader.class +0 -0
- data/lib/clojure/lang/LispReader.class +0 -0
- data/lib/clojure/lang/LockingTransaction$AbortException.class +0 -0
- data/lib/clojure/lang/LockingTransaction$CFn.class +0 -0
- data/lib/clojure/lang/LockingTransaction$Info.class +0 -0
- data/lib/clojure/lang/LockingTransaction$Notify.class +0 -0
- data/lib/clojure/lang/LockingTransaction$RetryEx.class +0 -0
- data/lib/clojure/lang/LockingTransaction.class +0 -0
- data/lib/clojure/lang/MapEntry.class +0 -0
- data/lib/clojure/lang/MultiFn.class +0 -0
- data/lib/clojure/lang/Named.class +0 -0
- data/lib/clojure/lang/Namespace.class +0 -0
- data/lib/clojure/lang/Numbers$BigDecimalOps.class +0 -0
- data/lib/clojure/lang/Numbers$BigIntegerBitOps.class +0 -0
- data/lib/clojure/lang/Numbers$BigIntegerOps.class +0 -0
- data/lib/clojure/lang/Numbers$BitOps.class +0 -0
- data/lib/clojure/lang/Numbers$DoubleOps.class +0 -0
- data/lib/clojure/lang/Numbers$FloatOps.class +0 -0
- data/lib/clojure/lang/Numbers$IntegerBitOps.class +0 -0
- data/lib/clojure/lang/Numbers$IntegerOps.class +0 -0
- data/lib/clojure/lang/Numbers$LongBitOps.class +0 -0
- data/lib/clojure/lang/Numbers$LongOps.class +0 -0
- data/lib/clojure/lang/Numbers$Ops.class +0 -0
- data/lib/clojure/lang/Numbers$RatioOps.class +0 -0
- data/lib/clojure/lang/Numbers.class +0 -0
- data/lib/clojure/lang/Obj.class +0 -0
- data/lib/clojure/lang/PersistentArrayMap$Iter.class +0 -0
- data/lib/clojure/lang/PersistentArrayMap$Seq.class +0 -0
- data/lib/clojure/lang/PersistentArrayMap.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$BitmapIndexedNode$Seq.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$BitmapIndexedNode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$EmptyNode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$FullNode$Seq.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$FullNode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$HashCollisionNode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$INode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap$LeafNode.class +0 -0
- data/lib/clojure/lang/PersistentHashMap.class +0 -0
- data/lib/clojure/lang/PersistentHashSet.class +0 -0
- data/lib/clojure/lang/PersistentList$1.class +0 -0
- data/lib/clojure/lang/PersistentList$EmptyList$1.class +0 -0
- data/lib/clojure/lang/PersistentList$EmptyList.class +0 -0
- data/lib/clojure/lang/PersistentList.class +0 -0
- data/lib/clojure/lang/PersistentQueue$Seq.class +0 -0
- data/lib/clojure/lang/PersistentQueue.class +0 -0
- data/lib/clojure/lang/PersistentStructMap$1.class +0 -0
- data/lib/clojure/lang/PersistentStructMap$Def.class +0 -0
- data/lib/clojure/lang/PersistentStructMap$Seq.class +0 -0
- data/lib/clojure/lang/PersistentStructMap.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$Black.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$BlackBranch.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$BlackBranchVal.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$BlackVal.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$KeyIterator.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$Node.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$NodeIterator.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$Red.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$RedBranch.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$RedBranchVal.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$RedVal.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$Seq.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap$ValIterator.class +0 -0
- data/lib/clojure/lang/PersistentTreeMap.class +0 -0
- data/lib/clojure/lang/PersistentTreeSet.class +0 -0
- data/lib/clojure/lang/PersistentVector.class +0 -0
- data/lib/clojure/lang/ProxyHandler.class +0 -0
- data/lib/clojure/lang/RT$1.class +0 -0
- data/lib/clojure/lang/RT$2.class +0 -0
- data/lib/clojure/lang/RT$3.class +0 -0
- data/lib/clojure/lang/RT$4.class +0 -0
- data/lib/clojure/lang/RT$5.class +0 -0
- data/lib/clojure/lang/RT$6.class +0 -0
- data/lib/clojure/lang/RT.class +0 -0
- data/lib/clojure/lang/Range$Src.class +0 -0
- data/lib/clojure/lang/Range.class +0 -0
- data/lib/clojure/lang/Ratio.class +0 -0
- data/lib/clojure/lang/Ref$TVal.class +0 -0
- data/lib/clojure/lang/Ref.class +0 -0
- data/lib/clojure/lang/Reflector.class +0 -0
- data/lib/clojure/lang/Repl.class +0 -0
- data/lib/clojure/lang/RestFn.class +0 -0
- data/lib/clojure/lang/Reversible.class +0 -0
- data/lib/clojure/lang/Script.class +0 -0
- data/lib/clojure/lang/SeqEnumeration.class +0 -0
- data/lib/clojure/lang/SeqIterator.class +0 -0
- data/lib/clojure/lang/Seqable.class +0 -0
- data/lib/clojure/lang/Sequential.class +0 -0
- data/lib/clojure/lang/Settable.class +0 -0
- data/lib/clojure/lang/Sorted.class +0 -0
- data/lib/clojure/lang/Stream$1.class +0 -0
- data/lib/clojure/lang/Stream$2.class +0 -0
- data/lib/clojure/lang/Stream.class +0 -0
- data/lib/clojure/lang/Streamable.class +0 -0
- data/lib/clojure/lang/StringSeq.class +0 -0
- data/lib/clojure/lang/Symbol.class +0 -0
- data/lib/clojure/lang/TransactionalHashMap$1.class +0 -0
- data/lib/clojure/lang/TransactionalHashMap.class +0 -0
- data/lib/clojure/lang/Util.class +0 -0
- data/lib/clojure/lang/Var$1.class +0 -0
- data/lib/clojure/lang/Var$2.class +0 -0
- data/lib/clojure/lang/Var$Frame.class +0 -0
- data/lib/clojure/lang/Var.class +0 -0
- data/lib/clojure/lang/XMLHandler.class +0 -0
- data/lib/clojure/main$eval_opt__5839.class +0 -0
- data/lib/clojure/main$help_opt__5871.class +0 -0
- data/lib/clojure/main$init_dispatch__5843.class +0 -0
- data/lib/clojure/main$init_opt__5836.class +0 -0
- data/lib/clojure/main$initialize__5846.class +0 -0
- data/lib/clojure/main$legacy_repl__5878.class +0 -0
- data/lib/clojure/main$legacy_script__5883.class +0 -0
- data/lib/clojure/main$load_script__5833.class +0 -0
- data/lib/clojure/main$main__5888.class +0 -0
- data/lib/clojure/main$main_dispatch__5874.class +0 -0
- data/lib/clojure/main$null_opt__5868.class +0 -0
- data/lib/clojure/main$repl__5813$fn__5816.class +0 -0
- data/lib/clojure/main$repl__5813$fn__5819.class +0 -0
- data/lib/clojure/main$repl__5813$fn__5822.class +0 -0
- data/lib/clojure/main$repl__5813$fn__5829.class +0 -0
- data/lib/clojure/main$repl__5813$read_eval_print__5825.class +0 -0
- data/lib/clojure/main$repl__5813.class +0 -0
- data/lib/clojure/main$repl_caught__5810.class +0 -0
- data/lib/clojure/main$repl_exception__5807.class +0 -0
- data/lib/clojure/main$repl_opt__5853$fn__5856.class +0 -0
- data/lib/clojure/main$repl_opt__5853$fn__5859.class +0 -0
- data/lib/clojure/main$repl_opt__5853.class +0 -0
- data/lib/clojure/main$repl_prompt__5789.class +0 -0
- data/lib/clojure/main$repl_read__5799.class +0 -0
- data/lib/clojure/main$root_cause__5803.class +0 -0
- data/lib/clojure/main$script_opt__5864.class +0 -0
- data/lib/clojure/main$skip_if_eol__5792.class +0 -0
- data/lib/clojure/main$skip_whitespace__5795.class +0 -0
- data/lib/clojure/main$with_bindings__5786.class +0 -0
- data/lib/clojure/main.class +0 -0
- data/lib/clojure/main.clj +337 -0
- data/lib/clojure/main__init.class +0 -0
- data/lib/clojure/parallel.clj +248 -0
- data/lib/clojure/proxy/clojure/lang/APersistentMap.class +0 -0
- data/lib/clojure/proxy/java/lang/Object$ContentHandler.class +0 -0
- data/lib/clojure/proxy/java/lang/Object$Future$IDeref.class +0 -0
- data/lib/clojure/proxy/java/lang/Object$TableModel.class +0 -0
- data/lib/clojure/proxy/java/lang/Object$TreeModel.class +0 -0
- data/lib/clojure/proxy/javax/swing/table/AbstractTableModel.class +0 -0
- data/lib/clojure/set$bubble_max_key__5896$fn__5898.class +0 -0
- data/lib/clojure/set$bubble_max_key__5896.class +0 -0
- data/lib/clojure/set$difference__5920$fn__5923.class +0 -0
- data/lib/clojure/set$difference__5920.class +0 -0
- data/lib/clojure/set$index__5956$fn__5958.class +0 -0
- data/lib/clojure/set$index__5956.class +0 -0
- data/lib/clojure/set$intersection__5909$fn__5912.class +0 -0
- data/lib/clojure/set$intersection__5909$fn__5916.class +0 -0
- data/lib/clojure/set$intersection__5909.class +0 -0
- data/lib/clojure/set$join__5974$fn__5977$fn__5979.class +0 -0
- data/lib/clojure/set$join__5974$fn__5977.class +0 -0
- data/lib/clojure/set$join__5974$fn__5985$fn__5987.class +0 -0
- data/lib/clojure/set$join__5974$fn__5985.class +0 -0
- data/lib/clojure/set$join__5974.class +0 -0
- data/lib/clojure/set$map_invert__5962$fn__5965.class +0 -0
- data/lib/clojure/set$map_invert__5962.class +0 -0
- data/lib/clojure/set$project__5935$fn__5937.class +0 -0
- data/lib/clojure/set$project__5935.class +0 -0
- data/lib/clojure/set$rename__5950$fn__5952.class +0 -0
- data/lib/clojure/set$rename__5950.class +0 -0
- data/lib/clojure/set$rename_keys__5941$fn__5944.class +0 -0
- data/lib/clojure/set$rename_keys__5941.class +0 -0
- data/lib/clojure/set$select__5928$fn__5930.class +0 -0
- data/lib/clojure/set$select__5928.class +0 -0
- data/lib/clojure/set$union__5902.class +0 -0
- data/lib/clojure/set.clj +148 -0
- data/lib/clojure/set__init.class +0 -0
- data/lib/clojure/version.properties +5 -0
- data/lib/clojure/xml$emit__6057.class +0 -0
- data/lib/clojure/xml$emit_element__6052.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6007.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6010.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6013.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6016.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6019.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6022.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6025.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6028$attrs__6030.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6028.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6034.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6037.class +0 -0
- data/lib/clojure/xml$fn__5994$fn__6040.class +0 -0
- data/lib/clojure/xml$fn__5994$push_chars__6000$fn__6002.class +0 -0
- data/lib/clojure/xml$fn__5994$push_chars__6000.class +0 -0
- data/lib/clojure/xml$fn__5994$push_content__5996.class +0 -0
- data/lib/clojure/xml$fn__5994.class +0 -0
- data/lib/clojure/xml$parse__6048.class +0 -0
- data/lib/clojure/xml$startparse_sax__6045.class +0 -0
- data/lib/clojure/xml.clj +115 -0
- data/lib/clojure/xml__init.class +0 -0
- data/lib/clojure/zip$append_child__6155.class +0 -0
- data/lib/clojure/zip$branch_QMARK___6085.class +0 -0
- data/lib/clojure/zip$children__6088.class +0 -0
- data/lib/clojure/zip$down__6103.class +0 -0
- data/lib/clojure/zip$edit__6149.class +0 -0
- data/lib/clojure/zip$end_QMARK___6171.class +0 -0
- data/lib/clojure/zip$insert_child__6152.class +0 -0
- data/lib/clojure/zip$insert_left__6137.class +0 -0
- data/lib/clojure/zip$insert_right__6141.class +0 -0
- data/lib/clojure/zip$left__6127.class +0 -0
- data/lib/clojure/zip$leftmost__6132.class +0 -0
- data/lib/clojure/zip$lefts__6097.class +0 -0
- data/lib/clojure/zip$make_node__6091.class +0 -0
- data/lib/clojure/zip$next__6158.class +0 -0
- data/lib/clojure/zip$node__6082.class +0 -0
- data/lib/clojure/zip$path__6094.class +0 -0
- data/lib/clojure/zip$prev__6165.class +0 -0
- data/lib/clojure/zip$remove__6174.class +0 -0
- data/lib/clojure/zip$replace__6145.class +0 -0
- data/lib/clojure/zip$right__6116.class +0 -0
- data/lib/clojure/zip$rightmost__6122.class +0 -0
- data/lib/clojure/zip$rights__6100.class +0 -0
- data/lib/clojure/zip$root__6113.class +0 -0
- data/lib/clojure/zip$seq_zip__6063$fn__6065.class +0 -0
- data/lib/clojure/zip$seq_zip__6063.class +0 -0
- data/lib/clojure/zip$up__6108.class +0 -0
- data/lib/clojure/zip$vector_zip__6069$fn__6071.class +0 -0
- data/lib/clojure/zip$vector_zip__6069.class +0 -0
- data/lib/clojure/zip$xml_zip__6075$fn__6077.class +0 -0
- data/lib/clojure/zip$xml_zip__6075.class +0 -0
- data/lib/clojure/zip$zipper__6060.class +0 -0
- data/lib/clojure/zip.clj +278 -0
- data/lib/clojure/zip__init.class +0 -0
- data/src/clj/clojure/core.clj +4121 -0
- data/src/clj/clojure/core_print.clj +317 -0
- data/src/clj/clojure/core_proxy.clj +394 -0
- data/src/clj/clojure/genclass.clj +683 -0
- data/src/clj/clojure/inspector.clj +180 -0
- data/src/clj/clojure/main.clj +337 -0
- data/src/clj/clojure/parallel.clj +248 -0
- data/src/clj/clojure/set.clj +148 -0
- data/src/clj/clojure/version.properties +5 -0
- data/src/clj/clojure/xml.clj +115 -0
- data/src/clj/clojure/zip.clj +278 -0
- data/src/jvm/clojure/asm/AnnotationVisitor.java +97 -0
- data/src/jvm/clojure/asm/AnnotationWriter.java +357 -0
- data/src/jvm/clojure/asm/Attribute.java +253 -0
- data/src/jvm/clojure/asm/ByteVector.java +318 -0
- data/src/jvm/clojure/asm/ClassAdapter.java +115 -0
- data/src/jvm/clojure/asm/ClassReader.java +2224 -0
- data/src/jvm/clojure/asm/ClassVisitor.java +196 -0
- data/src/jvm/clojure/asm/ClassWriter.java +1415 -0
- data/src/jvm/clojure/asm/Edge.java +75 -0
- data/src/jvm/clojure/asm/FieldVisitor.java +64 -0
- data/src/jvm/clojure/asm/FieldWriter.java +290 -0
- data/src/jvm/clojure/asm/Frame.java +1506 -0
- data/src/jvm/clojure/asm/Handler.java +70 -0
- data/src/jvm/clojure/asm/Item.java +258 -0
- data/src/jvm/clojure/asm/Label.java +437 -0
- data/src/jvm/clojure/asm/MethodAdapter.java +186 -0
- data/src/jvm/clojure/asm/MethodVisitor.java +396 -0
- data/src/jvm/clojure/asm/MethodWriter.java +3029 -0
- data/src/jvm/clojure/asm/Opcodes.java +341 -0
- data/src/jvm/clojure/asm/Type.java +872 -0
- data/src/jvm/clojure/asm/commons/AdviceAdapter.java +681 -0
- data/src/jvm/clojure/asm/commons/AnalyzerAdapter.java +938 -0
- data/src/jvm/clojure/asm/commons/CodeSizeEvaluator.java +234 -0
- data/src/jvm/clojure/asm/commons/EmptyVisitor.java +221 -0
- data/src/jvm/clojure/asm/commons/GeneratorAdapter.java +1533 -0
- data/src/jvm/clojure/asm/commons/LocalVariablesSorter.java +330 -0
- data/src/jvm/clojure/asm/commons/Method.java +267 -0
- data/src/jvm/clojure/asm/commons/SerialVersionUIDAdder.java +508 -0
- data/src/jvm/clojure/asm/commons/StaticInitMerger.java +102 -0
- data/src/jvm/clojure/asm/commons/TableSwitchGenerator.java +55 -0
- data/src/jvm/clojure/asm/commons/package.html +48 -0
- data/src/jvm/clojure/asm/package.html +87 -0
- data/src/jvm/clojure/lang/AFn.java +452 -0
- data/src/jvm/clojure/lang/AFunction.java +47 -0
- data/src/jvm/clojure/lang/AMapEntry.java +149 -0
- data/src/jvm/clojure/lang/APersistentMap.java +382 -0
- data/src/jvm/clojure/lang/APersistentSet.java +159 -0
- data/src/jvm/clojure/lang/APersistentVector.java +579 -0
- data/src/jvm/clojure/lang/ARef.java +107 -0
- data/src/jvm/clojure/lang/AReference.java +40 -0
- data/src/jvm/clojure/lang/ASeq.java +282 -0
- data/src/jvm/clojure/lang/Agent.java +194 -0
- data/src/jvm/clojure/lang/ArraySeq.java +316 -0
- data/src/jvm/clojure/lang/ArrayStream.java +184 -0
- data/src/jvm/clojure/lang/Associative.java +22 -0
- data/src/jvm/clojure/lang/Atom.java +104 -0
- data/src/jvm/clojure/lang/Binding.java +26 -0
- data/src/jvm/clojure/lang/Box.java +22 -0
- data/src/jvm/clojure/lang/Compile.java +73 -0
- data/src/jvm/clojure/lang/Compiler.java +5017 -0
- data/src/jvm/clojure/lang/Cons.java +53 -0
- data/src/jvm/clojure/lang/Counted.java +18 -0
- data/src/jvm/clojure/lang/Delay.java +38 -0
- data/src/jvm/clojure/lang/DynamicClassLoader.java +71 -0
- data/src/jvm/clojure/lang/EnumerationSeq.java +71 -0
- data/src/jvm/clojure/lang/Fn.java +16 -0
- data/src/jvm/clojure/lang/IDeref.java +17 -0
- data/src/jvm/clojure/lang/IFn.java +90 -0
- data/src/jvm/clojure/lang/IMapEntry.java +19 -0
- data/src/jvm/clojure/lang/IMeta.java +17 -0
- data/src/jvm/clojure/lang/IObj.java +18 -0
- data/src/jvm/clojure/lang/IPersistentCollection.java +23 -0
- data/src/jvm/clojure/lang/IPersistentList.java +16 -0
- data/src/jvm/clojure/lang/IPersistentMap.java +23 -0
- data/src/jvm/clojure/lang/IPersistentSet.java +19 -0
- data/src/jvm/clojure/lang/IPersistentStack.java +19 -0
- data/src/jvm/clojure/lang/IPersistentVector.java +22 -0
- data/src/jvm/clojure/lang/IProxy.java +21 -0
- data/src/jvm/clojure/lang/IReduce.java +19 -0
- data/src/jvm/clojure/lang/IRef.java +27 -0
- data/src/jvm/clojure/lang/IReference.java +18 -0
- data/src/jvm/clojure/lang/ISeq.java +29 -0
- data/src/jvm/clojure/lang/IndexedSeq.java +16 -0
- data/src/jvm/clojure/lang/IteratorSeq.java +69 -0
- data/src/jvm/clojure/lang/IteratorStream.java +29 -0
- data/src/jvm/clojure/lang/Keyword.java +199 -0
- data/src/jvm/clojure/lang/LazilyPersistentVector.java +79 -0
- data/src/jvm/clojure/lang/LazySeq.java +233 -0
- data/src/jvm/clojure/lang/LineNumberingPushbackReader.java +75 -0
- data/src/jvm/clojure/lang/LispReader.java +1063 -0
- data/src/jvm/clojure/lang/LockingTransaction.java +583 -0
- data/src/jvm/clojure/lang/MapEntry.java +40 -0
- data/src/jvm/clojure/lang/MultiFn.java +308 -0
- data/src/jvm/clojure/lang/Named.java +19 -0
- data/src/jvm/clojure/lang/Namespace.java +178 -0
- data/src/jvm/clojure/lang/Numbers.java +4371 -0
- data/src/jvm/clojure/lang/Obj.java +33 -0
- data/src/jvm/clojure/lang/PersistentArrayMap.java +263 -0
- data/src/jvm/clojure/lang/PersistentHashMap.java +746 -0
- data/src/jvm/clojure/lang/PersistentHashSet.java +72 -0
- data/src/jvm/clojure/lang/PersistentList.java +298 -0
- data/src/jvm/clojure/lang/PersistentQueue.java +304 -0
- data/src/jvm/clojure/lang/PersistentStructMap.java +225 -0
- data/src/jvm/clojure/lang/PersistentTreeMap.java +998 -0
- data/src/jvm/clojure/lang/PersistentTreeSet.java +94 -0
- data/src/jvm/clojure/lang/PersistentVector.java +320 -0
- data/src/jvm/clojure/lang/ProxyHandler.java +72 -0
- data/src/jvm/clojure/lang/RT.java +1676 -0
- data/src/jvm/clojure/lang/Range.java +85 -0
- data/src/jvm/clojure/lang/Ratio.java +74 -0
- data/src/jvm/clojure/lang/Ref.java +335 -0
- data/src/jvm/clojure/lang/Reflector.java +448 -0
- data/src/jvm/clojure/lang/Repl.java +22 -0
- data/src/jvm/clojure/lang/RestFn.java +1335 -0
- data/src/jvm/clojure/lang/Reversible.java +17 -0
- data/src/jvm/clojure/lang/Script.java +22 -0
- data/src/jvm/clojure/lang/SeqEnumeration.java +33 -0
- data/src/jvm/clojure/lang/SeqIterator.java +41 -0
- data/src/jvm/clojure/lang/Seqable.java +17 -0
- data/src/jvm/clojure/lang/Sequential.java +13 -0
- data/src/jvm/clojure/lang/Settable.java +18 -0
- data/src/jvm/clojure/lang/Sorted.java +25 -0
- data/src/jvm/clojure/lang/Stream.java +88 -0
- data/src/jvm/clojure/lang/Streamable.java +17 -0
- data/src/jvm/clojure/lang/StringSeq.java +50 -0
- data/src/jvm/clojure/lang/Symbol.java +121 -0
- data/src/jvm/clojure/lang/TransactionalHashMap.java +197 -0
- data/src/jvm/clojure/lang/Util.java +74 -0
- data/src/jvm/clojure/lang/Var.java +472 -0
- data/src/jvm/clojure/lang/XMLHandler.java +89 -0
- data/src/jvm/clojure/main.java +41 -0
- metadata +1433 -0
Binary file
|
@@ -0,0 +1,4121 @@
|
|
1
|
+
; Copyright (c) Rich Hickey. All rights reserved.
|
2
|
+
; The use and distribution terms for this software are covered by the
|
3
|
+
; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php)
|
4
|
+
; which can be found in the file epl-v10.html at the root of this distribution.
|
5
|
+
; By using this software in any fashion, you are agreeing to be bound by
|
6
|
+
; the terms of this license.
|
7
|
+
; You must not remove this notice, or any other, from this software.
|
8
|
+
|
9
|
+
(ns clojure.core)
|
10
|
+
|
11
|
+
(def unquote)
|
12
|
+
(def unquote-splicing)
|
13
|
+
|
14
|
+
(def
|
15
|
+
#^{:arglists '([& items])
|
16
|
+
:doc "Creates a new list containing the items."}
|
17
|
+
list (. clojure.lang.PersistentList creator))
|
18
|
+
|
19
|
+
(def
|
20
|
+
#^{:arglists '([x seq])
|
21
|
+
:doc "Returns a new seq where x is the first element and seq is
|
22
|
+
the rest."}
|
23
|
+
|
24
|
+
cons (fn* cons [x seq] (. clojure.lang.RT (cons x seq))))
|
25
|
+
|
26
|
+
;during bootstrap we don't have destructuring let, loop or fn, will redefine later
|
27
|
+
(def
|
28
|
+
#^{:macro true}
|
29
|
+
let (fn* let [& decl] (cons 'let* decl)))
|
30
|
+
|
31
|
+
(def
|
32
|
+
#^{:macro true}
|
33
|
+
loop (fn* loop [& decl] (cons 'loop* decl)))
|
34
|
+
|
35
|
+
(def
|
36
|
+
#^{:macro true}
|
37
|
+
fn (fn* fn [& decl] (cons 'fn* decl)))
|
38
|
+
|
39
|
+
(def
|
40
|
+
#^{:arglists '([coll])
|
41
|
+
:doc "Returns the first item in the collection. Calls seq on its
|
42
|
+
argument. If coll is nil, returns nil."}
|
43
|
+
first (fn first [coll] (. clojure.lang.RT (first coll))))
|
44
|
+
|
45
|
+
(def
|
46
|
+
#^{:arglists '([coll])
|
47
|
+
:tag clojure.lang.ISeq
|
48
|
+
:doc "Returns a seq of the items after the first. Calls seq on its
|
49
|
+
argument. If there are no more items, returns nil."}
|
50
|
+
next (fn next [x] (. clojure.lang.RT (next x))))
|
51
|
+
|
52
|
+
(def
|
53
|
+
#^{:arglists '([coll])
|
54
|
+
:tag clojure.lang.ISeq
|
55
|
+
:doc "Returns a possibly empty seq of the items after the first. Calls seq on its
|
56
|
+
argument."}
|
57
|
+
rest (fn rest [x] (. clojure.lang.RT (more x))))
|
58
|
+
|
59
|
+
(def
|
60
|
+
#^{:arglists '([coll x] [coll x & xs])
|
61
|
+
:doc "conj[oin]. Returns a new collection with the xs
|
62
|
+
'added'. (conj nil item) returns (item). The 'addition' may
|
63
|
+
happen at different 'places' depending on the concrete type."}
|
64
|
+
conj (fn conj
|
65
|
+
([coll x] (. clojure.lang.RT (conj coll x)))
|
66
|
+
([coll x & xs]
|
67
|
+
(if xs
|
68
|
+
(recur (conj coll x) (first xs) (next xs))
|
69
|
+
(conj coll x)))))
|
70
|
+
|
71
|
+
(def
|
72
|
+
#^{:doc "Same as (first (next x))"
|
73
|
+
:arglists '([x])}
|
74
|
+
second (fn second [x] (first (next x))))
|
75
|
+
|
76
|
+
(def
|
77
|
+
#^{:doc "Same as (first (first x))"
|
78
|
+
:arglists '([x])}
|
79
|
+
ffirst (fn ffirst [x] (first (first x))))
|
80
|
+
|
81
|
+
(def
|
82
|
+
#^{:doc "Same as (next (first x))"
|
83
|
+
:arglists '([x])}
|
84
|
+
nfirst (fn nfirst [x] (next (first x))))
|
85
|
+
|
86
|
+
(def
|
87
|
+
#^{:doc "Same as (first (next x))"
|
88
|
+
:arglists '([x])}
|
89
|
+
fnext (fn fnext [x] (first (next x))))
|
90
|
+
|
91
|
+
(def
|
92
|
+
#^{:doc "Same as (next (next x))"
|
93
|
+
:arglists '([x])}
|
94
|
+
nnext (fn nnext [x] (next (next x))))
|
95
|
+
|
96
|
+
(def
|
97
|
+
#^{:arglists '([coll])
|
98
|
+
:doc "Returns a seq on the collection. If the collection is
|
99
|
+
empty, returns nil. (seq nil) returns nil. seq also works on
|
100
|
+
Strings, native Java arrays (of reference types) and any objects
|
101
|
+
that implement Iterable."
|
102
|
+
:tag clojure.lang.ISeq}
|
103
|
+
seq (fn seq [coll] (. clojure.lang.RT (seq coll))))
|
104
|
+
|
105
|
+
(def
|
106
|
+
#^{:arglists '([#^Class c x])
|
107
|
+
:doc "Evaluates x and tests if it is an instance of the class
|
108
|
+
c. Returns true or false"}
|
109
|
+
instance? (fn instance? [#^Class c x] (. c (isInstance x))))
|
110
|
+
|
111
|
+
(def
|
112
|
+
#^{:arglists '([x])
|
113
|
+
:doc "Return true if x implements ISeq"}
|
114
|
+
seq? (fn seq? [x] (instance? clojure.lang.ISeq x)))
|
115
|
+
|
116
|
+
(def
|
117
|
+
#^{:arglists '([x])
|
118
|
+
:doc "Return true if x is a String"}
|
119
|
+
string? (fn string? [x] (instance? String x)))
|
120
|
+
|
121
|
+
(def
|
122
|
+
#^{:arglists '([x])
|
123
|
+
:doc "Return true if x implements IPersistentMap"}
|
124
|
+
map? (fn map? [x] (instance? clojure.lang.IPersistentMap x)))
|
125
|
+
|
126
|
+
(def
|
127
|
+
#^{:arglists '([x])
|
128
|
+
:doc "Return true if x implements IPersistentVector "}
|
129
|
+
vector? (fn vector? [x] (instance? clojure.lang.IPersistentVector x)))
|
130
|
+
|
131
|
+
(def
|
132
|
+
#^{:private true}
|
133
|
+
sigs
|
134
|
+
(fn [fdecl]
|
135
|
+
(if (seq? (first fdecl))
|
136
|
+
(loop [ret [] fdecl fdecl]
|
137
|
+
(if fdecl
|
138
|
+
(recur (conj ret (first (first fdecl))) (next fdecl))
|
139
|
+
(seq ret)))
|
140
|
+
(list (first fdecl)))))
|
141
|
+
|
142
|
+
(def
|
143
|
+
#^{:arglists '([map key val] [map key val & kvs])
|
144
|
+
:doc "assoc[iate]. When applied to a map, returns a new map of the
|
145
|
+
same (hashed/sorted) type, that contains the mapping of key(s) to
|
146
|
+
val(s). When applied to a vector, returns a new vector that
|
147
|
+
contains val at index. Note - index must be <= (count vector)."}
|
148
|
+
assoc
|
149
|
+
(fn assoc
|
150
|
+
([map key val] (. clojure.lang.RT (assoc map key val)))
|
151
|
+
([map key val & kvs]
|
152
|
+
(let [ret (assoc map key val)]
|
153
|
+
(if kvs
|
154
|
+
(recur ret (first kvs) (second kvs) (nnext kvs))
|
155
|
+
ret)))))
|
156
|
+
|
157
|
+
;;;;;;;;;;;;;;;;; metadata ;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
158
|
+
(def
|
159
|
+
#^{:arglists '([obj])
|
160
|
+
:doc "Returns the metadata of obj, returns nil if there is no metadata."}
|
161
|
+
meta (fn meta [x]
|
162
|
+
(if (instance? clojure.lang.IMeta x)
|
163
|
+
(. #^clojure.lang.IMeta x (meta)))))
|
164
|
+
|
165
|
+
(def
|
166
|
+
#^{:arglists '([#^clojure.lang.IObj obj m])
|
167
|
+
:doc "Returns an object of the same type and value as obj, with
|
168
|
+
map m as its metadata."}
|
169
|
+
with-meta (fn with-meta [#^clojure.lang.IObj x m]
|
170
|
+
(. x (withMeta m))))
|
171
|
+
|
172
|
+
(def
|
173
|
+
#^{:arglists '([coll])
|
174
|
+
:doc "Return the last item in coll, in linear time"}
|
175
|
+
last (fn last [s]
|
176
|
+
(if (next s)
|
177
|
+
(recur (next s))
|
178
|
+
(first s))))
|
179
|
+
|
180
|
+
(def
|
181
|
+
#^{:arglists '([coll])
|
182
|
+
:doc "Return a seq of all but the last item in coll, in linear time"}
|
183
|
+
butlast (fn butlast [s]
|
184
|
+
(loop [ret [] s s]
|
185
|
+
(if (next s)
|
186
|
+
(recur (conj ret (first s)) (next s))
|
187
|
+
(seq ret)))))
|
188
|
+
|
189
|
+
(def
|
190
|
+
|
191
|
+
#^{:doc "Same as (def name (fn [params* ] exprs*)) or (def
|
192
|
+
name (fn ([params* ] exprs*)+)) with any doc-string or attrs added
|
193
|
+
to the var metadata"
|
194
|
+
:arglists '([name doc-string? attr-map? [params*] body]
|
195
|
+
[name doc-string? attr-map? ([params*] body)+ attr-map?])}
|
196
|
+
defn (fn defn [name & fdecl]
|
197
|
+
(let [m (if (string? (first fdecl))
|
198
|
+
{:doc (first fdecl)}
|
199
|
+
{})
|
200
|
+
fdecl (if (string? (first fdecl))
|
201
|
+
(next fdecl)
|
202
|
+
fdecl)
|
203
|
+
m (if (map? (first fdecl))
|
204
|
+
(conj m (first fdecl))
|
205
|
+
m)
|
206
|
+
fdecl (if (map? (first fdecl))
|
207
|
+
(next fdecl)
|
208
|
+
fdecl)
|
209
|
+
fdecl (if (vector? (first fdecl))
|
210
|
+
(list fdecl)
|
211
|
+
fdecl)
|
212
|
+
m (if (map? (last fdecl))
|
213
|
+
(conj m (last fdecl))
|
214
|
+
m)
|
215
|
+
fdecl (if (map? (last fdecl))
|
216
|
+
(butlast fdecl)
|
217
|
+
fdecl)
|
218
|
+
m (conj {:arglists (list 'quote (sigs fdecl))} m)]
|
219
|
+
(list 'def (with-meta name (conj (if (meta name) (meta name) {}) m))
|
220
|
+
(cons `fn fdecl)))))
|
221
|
+
|
222
|
+
(. (var defn) (setMacro))
|
223
|
+
|
224
|
+
(defn cast
|
225
|
+
"Throws a ClassCastException if x is not a c, else returns x."
|
226
|
+
[#^Class c x]
|
227
|
+
(. c (cast x)))
|
228
|
+
|
229
|
+
(defn to-array
|
230
|
+
"Returns an array of Objects containing the contents of coll, which
|
231
|
+
can be any Collection. Maps to java.util.Collection.toArray()."
|
232
|
+
{:tag "[Ljava.lang.Object;"}
|
233
|
+
[coll] (. clojure.lang.RT (toArray coll)))
|
234
|
+
|
235
|
+
(defn vector
|
236
|
+
"Creates a new vector containing the args."
|
237
|
+
([] [])
|
238
|
+
([& args]
|
239
|
+
(. clojure.lang.LazilyPersistentVector (create args))))
|
240
|
+
|
241
|
+
(defn vec
|
242
|
+
"Creates a new vector containing the contents of coll."
|
243
|
+
([coll]
|
244
|
+
(. clojure.lang.LazilyPersistentVector (createOwning (to-array coll)))))
|
245
|
+
|
246
|
+
(defn hash-map
|
247
|
+
"keyval => key val
|
248
|
+
Returns a new hash map with supplied mappings."
|
249
|
+
([] {})
|
250
|
+
([& keyvals]
|
251
|
+
(. clojure.lang.PersistentHashMap (create keyvals))))
|
252
|
+
|
253
|
+
(defn hash-set
|
254
|
+
"Returns a new hash set with supplied keys."
|
255
|
+
([] #{})
|
256
|
+
([& keys]
|
257
|
+
(. clojure.lang.PersistentHashSet (create keys))))
|
258
|
+
|
259
|
+
(defn sorted-map
|
260
|
+
"keyval => key val
|
261
|
+
Returns a new sorted map with supplied mappings."
|
262
|
+
([& keyvals]
|
263
|
+
(. clojure.lang.PersistentTreeMap (create keyvals))))
|
264
|
+
|
265
|
+
(defn sorted-set
|
266
|
+
"Returns a new sorted set with supplied keys."
|
267
|
+
([& keys]
|
268
|
+
(. clojure.lang.PersistentTreeSet (create keys))))
|
269
|
+
|
270
|
+
(defn sorted-map-by
|
271
|
+
"keyval => key val
|
272
|
+
Returns a new sorted map with supplied mappings, using the supplied comparator."
|
273
|
+
([comparator & keyvals]
|
274
|
+
(. clojure.lang.PersistentTreeMap (create comparator keyvals))))
|
275
|
+
|
276
|
+
;;;;;;;;;;;;;;;;;;;;
|
277
|
+
(def
|
278
|
+
|
279
|
+
#^{:doc "Like defn, but the resulting function name is declared as a
|
280
|
+
macro and will be used as a macro by the compiler when it is
|
281
|
+
called."
|
282
|
+
:arglists '([name doc-string? attr-map? [params*] body]
|
283
|
+
[name doc-string? attr-map? ([params*] body)+ attr-map?])}
|
284
|
+
defmacro (fn [name & args]
|
285
|
+
(list 'do
|
286
|
+
(cons `defn (cons name args))
|
287
|
+
(list '. (list 'var name) '(setMacro))
|
288
|
+
(list 'var name))))
|
289
|
+
|
290
|
+
(. (var defmacro) (setMacro))
|
291
|
+
|
292
|
+
(defmacro when
|
293
|
+
"Evaluates test. If logical true, evaluates body in an implicit do."
|
294
|
+
[test & body]
|
295
|
+
(list 'if test (cons 'do body)))
|
296
|
+
|
297
|
+
(defmacro when-not
|
298
|
+
"Evaluates test. If logical false, evaluates body in an implicit do."
|
299
|
+
[test & body]
|
300
|
+
(list 'if test nil (cons 'do body)))
|
301
|
+
|
302
|
+
(defn nil?
|
303
|
+
"Returns true if x is nil, false otherwise."
|
304
|
+
{:tag Boolean}
|
305
|
+
[x] (identical? x nil))
|
306
|
+
|
307
|
+
(defn false?
|
308
|
+
"Returns true if x is the value false, false otherwise."
|
309
|
+
{:tag Boolean}
|
310
|
+
[x] (identical? x false))
|
311
|
+
|
312
|
+
(defn true?
|
313
|
+
"Returns true if x is the value true, false otherwise."
|
314
|
+
{:tag Boolean}
|
315
|
+
[x] (identical? x true))
|
316
|
+
|
317
|
+
(defn not
|
318
|
+
"Returns true if x is logical false, false otherwise."
|
319
|
+
{:tag Boolean}
|
320
|
+
[x] (if x false true))
|
321
|
+
|
322
|
+
(defn str
|
323
|
+
"With no args, returns the empty string. With one arg x, returns
|
324
|
+
x.toString(). (str nil) returns the empty string. With more than
|
325
|
+
one arg, returns the concatenation of the str values of the args."
|
326
|
+
{:tag String}
|
327
|
+
([] "")
|
328
|
+
([#^Object x]
|
329
|
+
(if (nil? x) "" (. x (toString))))
|
330
|
+
([x & ys]
|
331
|
+
((fn [#^StringBuilder sb more]
|
332
|
+
(if more
|
333
|
+
(recur (. sb (append (str (first more)))) (next more))
|
334
|
+
(str sb)))
|
335
|
+
(new StringBuilder #^String (str x)) ys)))
|
336
|
+
|
337
|
+
|
338
|
+
(defn symbol?
|
339
|
+
"Return true if x is a Symbol"
|
340
|
+
[x] (instance? clojure.lang.Symbol x))
|
341
|
+
|
342
|
+
(defn keyword?
|
343
|
+
"Return true if x is a Keyword"
|
344
|
+
[x] (instance? clojure.lang.Keyword x))
|
345
|
+
|
346
|
+
(defn symbol
|
347
|
+
"Returns a Symbol with the given namespace and name."
|
348
|
+
([name] (if (symbol? name) name (. clojure.lang.Symbol (intern name))))
|
349
|
+
([ns name] (. clojure.lang.Symbol (intern ns name))))
|
350
|
+
|
351
|
+
(defn keyword
|
352
|
+
"Returns a Keyword with the given namespace and name. Do not use :
|
353
|
+
in the keyword strings, it will be added automatically."
|
354
|
+
([name] (if (keyword? name) name (. clojure.lang.Keyword (intern nil name))))
|
355
|
+
([ns name] (. clojure.lang.Keyword (intern ns name))))
|
356
|
+
|
357
|
+
(defn gensym
|
358
|
+
"Returns a new symbol with a unique name. If a prefix string is
|
359
|
+
supplied, the name is prefix# where # is some unique number. If
|
360
|
+
prefix is not supplied, the prefix is 'G__'."
|
361
|
+
([] (gensym "G__"))
|
362
|
+
([prefix-string] (. clojure.lang.Symbol (intern (str prefix-string (str (. clojure.lang.RT (nextID))))))))
|
363
|
+
|
364
|
+
(defmacro cond
|
365
|
+
"Takes a set of test/expr pairs. It evaluates each test one at a
|
366
|
+
time. If a test returns logical true, cond evaluates and returns
|
367
|
+
the value of the corresponding expr and doesn't evaluate any of the
|
368
|
+
other tests or exprs. (cond) returns nil."
|
369
|
+
[& clauses]
|
370
|
+
(when clauses
|
371
|
+
(list 'if (first clauses)
|
372
|
+
(if (next clauses)
|
373
|
+
(second clauses)
|
374
|
+
(throw (IllegalArgumentException.
|
375
|
+
"cond requires an even number of forms")))
|
376
|
+
(cons 'clojure.core/cond (next (next clauses))))))
|
377
|
+
|
378
|
+
(defn spread
|
379
|
+
{:private true}
|
380
|
+
[arglist]
|
381
|
+
(cond
|
382
|
+
(nil? arglist) nil
|
383
|
+
(nil? (next arglist)) (seq (first arglist))
|
384
|
+
:else (cons (first arglist) (spread (next arglist)))))
|
385
|
+
|
386
|
+
(defn apply
|
387
|
+
"Applies fn f to the argument list formed by prepending args to argseq."
|
388
|
+
{:arglists '([f args* argseq])}
|
389
|
+
[#^clojure.lang.IFn f & args]
|
390
|
+
(. f (applyTo (spread args))))
|
391
|
+
|
392
|
+
(defn vary-meta
|
393
|
+
"Returns an object of the same type and value as obj, with
|
394
|
+
(apply f (meta obj) args) as its metadata."
|
395
|
+
[obj f & args]
|
396
|
+
(with-meta obj (apply f (meta obj) args)))
|
397
|
+
|
398
|
+
(defn list*
|
399
|
+
"Creates a new list containing the item prepended to more."
|
400
|
+
[item & more]
|
401
|
+
(spread (cons item more)))
|
402
|
+
|
403
|
+
(defmacro lazy-seq
|
404
|
+
"Takes a body of expressions that returns an ISeq or nil, and yields
|
405
|
+
a Seqable object that will invoke the body only the first time seq
|
406
|
+
is called, and will cache the result and return it on all subsequent
|
407
|
+
seq calls."
|
408
|
+
[& body]
|
409
|
+
(list 'new 'clojure.lang.LazySeq (list* '#^{:once true} fn* [] body)))
|
410
|
+
|
411
|
+
(defn concat
|
412
|
+
"Returns a lazy seq representing the concatenation of the elements in the supplied colls."
|
413
|
+
([] (lazy-seq nil))
|
414
|
+
([x] (lazy-seq x))
|
415
|
+
([x y]
|
416
|
+
(lazy-seq
|
417
|
+
(let [s (seq x)]
|
418
|
+
(if s
|
419
|
+
(cons (first s) (concat (rest s) y))
|
420
|
+
y))))
|
421
|
+
([x y & zs]
|
422
|
+
(let [cat (fn cat [xys zs]
|
423
|
+
(lazy-seq
|
424
|
+
(let [xys (seq xys)]
|
425
|
+
(if xys
|
426
|
+
(cons (first xys) (cat (rest xys) zs))
|
427
|
+
(when zs
|
428
|
+
(cat (first zs) (next zs)))))))]
|
429
|
+
(cat (concat x y) zs))))
|
430
|
+
|
431
|
+
;;;;;;;;;;;;;;;;at this point all the support for syntax-quote exists;;;;;;;;;;;;;;;;;;;;;;
|
432
|
+
|
433
|
+
|
434
|
+
(defmacro delay
|
435
|
+
"Takes a body of expressions and yields a Delay object that will
|
436
|
+
invoke the body only the first time it is forced (with force), and
|
437
|
+
will cache the result and return it on all subsequent force
|
438
|
+
calls."
|
439
|
+
[& body]
|
440
|
+
(list 'new 'clojure.lang.Delay (list* `#^{:once true} fn* [] body)))
|
441
|
+
|
442
|
+
(defn delay?
|
443
|
+
"returns true if x is a Delay created with delay"
|
444
|
+
[x] (instance? clojure.lang.Delay x))
|
445
|
+
|
446
|
+
(defn force
|
447
|
+
"If x is a Delay, returns the (possibly cached) value of its expression, else returns x"
|
448
|
+
[x] (. clojure.lang.Delay (force x)))
|
449
|
+
|
450
|
+
(defmacro if-not
|
451
|
+
"Evaluates test. If logical false, evaluates and returns then expr, otherwise else expr, if supplied, else nil."
|
452
|
+
([test then] `(if-not ~test ~then nil))
|
453
|
+
([test then else]
|
454
|
+
`(if (not ~test) ~then ~else)))
|
455
|
+
|
456
|
+
(defn =
|
457
|
+
"Equality. Returns true if x equals y, false if not. Same as
|
458
|
+
Java x.equals(y) except it also works for nil, and compares
|
459
|
+
numbers and collections in a type-independent manner. Clojure's immutable data
|
460
|
+
structures define equals() (and thus =) as a value, not an identity,
|
461
|
+
comparison."
|
462
|
+
{:tag Boolean
|
463
|
+
:inline (fn [x y] `(. clojure.lang.Util equiv ~x ~y))
|
464
|
+
:inline-arities #{2}}
|
465
|
+
([x] true)
|
466
|
+
([x y] (clojure.lang.Util/equiv x y))
|
467
|
+
([x y & more]
|
468
|
+
(if (= x y)
|
469
|
+
(if (next more)
|
470
|
+
(recur y (first more) (next more))
|
471
|
+
(= y (first more)))
|
472
|
+
false)))
|
473
|
+
|
474
|
+
(defn not=
|
475
|
+
"Same as (not (= obj1 obj2))"
|
476
|
+
{:tag Boolean}
|
477
|
+
([x] false)
|
478
|
+
([x y] (not (= x y)))
|
479
|
+
([x y & more]
|
480
|
+
(not (apply = x y more))))
|
481
|
+
|
482
|
+
|
483
|
+
|
484
|
+
(defn compare
|
485
|
+
"Comparator. Returns 0 if x equals y, -1 if x is logically 'less
|
486
|
+
than' y, else 1. Same as Java x.compareTo(y) except it also works
|
487
|
+
for nil, and compares numbers and collections in a type-independent
|
488
|
+
manner. x must implement Comparable"
|
489
|
+
{:tag Integer
|
490
|
+
:inline (fn [x y] `(. clojure.lang.Util compare ~x ~y))}
|
491
|
+
[x y] (. clojure.lang.Util (compare x y)))
|
492
|
+
|
493
|
+
(defmacro and
|
494
|
+
"Evaluates exprs one at a time, from left to right. If a form
|
495
|
+
returns logical false (nil or false), and returns that value and
|
496
|
+
doesn't evaluate any of the other expressions, otherwise it returns
|
497
|
+
the value of the last expr. (and) returns true."
|
498
|
+
([] true)
|
499
|
+
([x] x)
|
500
|
+
([x & next]
|
501
|
+
`(let [and# ~x]
|
502
|
+
(if and# (and ~@next) and#))))
|
503
|
+
|
504
|
+
(defmacro or
|
505
|
+
"Evaluates exprs one at a time, from left to right. If a form
|
506
|
+
returns a logical true value, or returns that value and doesn't
|
507
|
+
evaluate any of the other expressions, otherwise it returns the
|
508
|
+
value of the last expression. (or) returns nil."
|
509
|
+
([] nil)
|
510
|
+
([x] x)
|
511
|
+
([x & next]
|
512
|
+
`(let [or# ~x]
|
513
|
+
(if or# or# (or ~@next)))))
|
514
|
+
|
515
|
+
;;;;;;;;;;;;;;;;;;; sequence fns ;;;;;;;;;;;;;;;;;;;;;;;
|
516
|
+
(defn reduce
|
517
|
+
"f should be a function of 2 arguments. If val is not supplied,
|
518
|
+
returns the result of applying f to the first 2 items in coll, then
|
519
|
+
applying f to that result and the 3rd item, etc. If coll contains no
|
520
|
+
items, f must accept no arguments as well, and reduce returns the
|
521
|
+
result of calling f with no arguments. If coll has only 1 item, it
|
522
|
+
is returned and f is not called. If val is supplied, returns the
|
523
|
+
result of applying f to val and the first item in coll, then
|
524
|
+
applying f to that result and the 2nd item, etc. If coll contains no
|
525
|
+
items, returns val and f is not called."
|
526
|
+
([f coll]
|
527
|
+
(let [s (seq coll)]
|
528
|
+
(if s
|
529
|
+
(if (instance? clojure.lang.IReduce s)
|
530
|
+
(. #^clojure.lang.IReduce s (reduce f))
|
531
|
+
(reduce f (first s) (next s)))
|
532
|
+
(f))))
|
533
|
+
([f val coll]
|
534
|
+
(let [s (seq coll)]
|
535
|
+
(if (instance? clojure.lang.IReduce s)
|
536
|
+
(. #^clojure.lang.IReduce s (reduce f val))
|
537
|
+
((fn [f val s]
|
538
|
+
(if s
|
539
|
+
(recur f (f val (first s)) (next s))
|
540
|
+
val))
|
541
|
+
f val s)))))
|
542
|
+
|
543
|
+
(defn reverse
|
544
|
+
"Returns a seq of the items in coll in reverse order. Not lazy."
|
545
|
+
[coll]
|
546
|
+
(reduce conj () coll))
|
547
|
+
|
548
|
+
;;math stuff
|
549
|
+
(defn +
|
550
|
+
"Returns the sum of nums. (+) returns 0."
|
551
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (add ~x ~y)))
|
552
|
+
:inline-arities #{2}}
|
553
|
+
([] 0)
|
554
|
+
([x] (cast Number x))
|
555
|
+
([x y] (. clojure.lang.Numbers (add x y)))
|
556
|
+
([x y & more]
|
557
|
+
(reduce + (+ x y) more)))
|
558
|
+
|
559
|
+
(defn *
|
560
|
+
"Returns the product of nums. (*) returns 1."
|
561
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (multiply ~x ~y)))
|
562
|
+
:inline-arities #{2}}
|
563
|
+
([] 1)
|
564
|
+
([x] (cast Number x))
|
565
|
+
([x y] (. clojure.lang.Numbers (multiply x y)))
|
566
|
+
([x y & more]
|
567
|
+
(reduce * (* x y) more)))
|
568
|
+
|
569
|
+
(defn /
|
570
|
+
"If no denominators are supplied, returns 1/numerator,
|
571
|
+
else returns numerator divided by all of the denominators."
|
572
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (divide ~x ~y)))
|
573
|
+
:inline-arities #{2}}
|
574
|
+
([x] (/ 1 x))
|
575
|
+
([x y] (. clojure.lang.Numbers (divide x y)))
|
576
|
+
([x y & more]
|
577
|
+
(reduce / (/ x y) more)))
|
578
|
+
|
579
|
+
(defn -
|
580
|
+
"If no ys are supplied, returns the negation of x, else subtracts
|
581
|
+
the ys from x and returns the result."
|
582
|
+
{:inline (fn [& args] `(. clojure.lang.Numbers (minus ~@args)))
|
583
|
+
:inline-arities #{1 2}}
|
584
|
+
([x] (. clojure.lang.Numbers (minus x)))
|
585
|
+
([x y] (. clojure.lang.Numbers (minus x y)))
|
586
|
+
([x y & more]
|
587
|
+
(reduce - (- x y) more)))
|
588
|
+
|
589
|
+
(defn <
|
590
|
+
"Returns non-nil if nums are in monotonically increasing order,
|
591
|
+
otherwise false."
|
592
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (lt ~x ~y)))
|
593
|
+
:inline-arities #{2}}
|
594
|
+
([x] true)
|
595
|
+
([x y] (. clojure.lang.Numbers (lt x y)))
|
596
|
+
([x y & more]
|
597
|
+
(if (< x y)
|
598
|
+
(if (next more)
|
599
|
+
(recur y (first more) (next more))
|
600
|
+
(< y (first more)))
|
601
|
+
false)))
|
602
|
+
|
603
|
+
(defn <=
|
604
|
+
"Returns non-nil if nums are in monotonically non-decreasing order,
|
605
|
+
otherwise false."
|
606
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (lte ~x ~y)))
|
607
|
+
:inline-arities #{2}}
|
608
|
+
([x] true)
|
609
|
+
([x y] (. clojure.lang.Numbers (lte x y)))
|
610
|
+
([x y & more]
|
611
|
+
(if (<= x y)
|
612
|
+
(if (next more)
|
613
|
+
(recur y (first more) (next more))
|
614
|
+
(<= y (first more)))
|
615
|
+
false)))
|
616
|
+
|
617
|
+
(defn >
|
618
|
+
"Returns non-nil if nums are in monotonically decreasing order,
|
619
|
+
otherwise false."
|
620
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (gt ~x ~y)))
|
621
|
+
:inline-arities #{2}}
|
622
|
+
([x] true)
|
623
|
+
([x y] (. clojure.lang.Numbers (gt x y)))
|
624
|
+
([x y & more]
|
625
|
+
(if (> x y)
|
626
|
+
(if (next more)
|
627
|
+
(recur y (first more) (next more))
|
628
|
+
(> y (first more)))
|
629
|
+
false)))
|
630
|
+
|
631
|
+
(defn >=
|
632
|
+
"Returns non-nil if nums are in monotonically non-increasing order,
|
633
|
+
otherwise false."
|
634
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (gte ~x ~y)))
|
635
|
+
:inline-arities #{2}}
|
636
|
+
([x] true)
|
637
|
+
([x y] (. clojure.lang.Numbers (gte x y)))
|
638
|
+
([x y & more]
|
639
|
+
(if (>= x y)
|
640
|
+
(if (next more)
|
641
|
+
(recur y (first more) (next more))
|
642
|
+
(>= y (first more)))
|
643
|
+
false)))
|
644
|
+
|
645
|
+
(defn ==
|
646
|
+
"Returns non-nil if nums all have the same value, otherwise false"
|
647
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (equiv ~x ~y)))
|
648
|
+
:inline-arities #{2}}
|
649
|
+
([x] true)
|
650
|
+
([x y] (. clojure.lang.Numbers (equiv x y)))
|
651
|
+
([x y & more]
|
652
|
+
(if (== x y)
|
653
|
+
(if (next more)
|
654
|
+
(recur y (first more) (next more))
|
655
|
+
(== y (first more)))
|
656
|
+
false)))
|
657
|
+
|
658
|
+
(defn max
|
659
|
+
"Returns the greatest of the nums."
|
660
|
+
([x] x)
|
661
|
+
([x y] (if (> x y) x y))
|
662
|
+
([x y & more]
|
663
|
+
(reduce max (max x y) more)))
|
664
|
+
|
665
|
+
(defn min
|
666
|
+
"Returns the least of the nums."
|
667
|
+
([x] x)
|
668
|
+
([x y] (if (< x y) x y))
|
669
|
+
([x y & more]
|
670
|
+
(reduce min (min x y) more)))
|
671
|
+
|
672
|
+
(defn inc
|
673
|
+
"Returns a number one greater than num."
|
674
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (inc ~x)))}
|
675
|
+
[x] (. clojure.lang.Numbers (inc x)))
|
676
|
+
|
677
|
+
(defn dec
|
678
|
+
"Returns a number one less than num."
|
679
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (dec ~x)))}
|
680
|
+
[x] (. clojure.lang.Numbers (dec x)))
|
681
|
+
|
682
|
+
(defn unchecked-inc
|
683
|
+
"Returns a number one greater than x, an int or long.
|
684
|
+
Note - uses a primitive operator subject to overflow."
|
685
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (unchecked_inc ~x)))}
|
686
|
+
[x] (. clojure.lang.Numbers (unchecked_inc x)))
|
687
|
+
|
688
|
+
(defn unchecked-dec
|
689
|
+
"Returns a number one less than x, an int or long.
|
690
|
+
Note - uses a primitive operator subject to overflow."
|
691
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (unchecked_dec ~x)))}
|
692
|
+
[x] (. clojure.lang.Numbers (unchecked_dec x)))
|
693
|
+
|
694
|
+
(defn unchecked-negate
|
695
|
+
"Returns the negation of x, an int or long.
|
696
|
+
Note - uses a primitive operator subject to overflow."
|
697
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (unchecked_negate ~x)))}
|
698
|
+
[x] (. clojure.lang.Numbers (unchecked_negate x)))
|
699
|
+
|
700
|
+
(defn unchecked-add
|
701
|
+
"Returns the sum of x and y, both int or long.
|
702
|
+
Note - uses a primitive operator subject to overflow."
|
703
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (unchecked_add ~x ~y)))}
|
704
|
+
[x y] (. clojure.lang.Numbers (unchecked_add x y)))
|
705
|
+
|
706
|
+
(defn unchecked-subtract
|
707
|
+
"Returns the difference of x and y, both int or long.
|
708
|
+
Note - uses a primitive operator subject to overflow."
|
709
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (unchecked_subtract ~x ~y)))}
|
710
|
+
[x y] (. clojure.lang.Numbers (unchecked_subtract x y)))
|
711
|
+
|
712
|
+
(defn unchecked-multiply
|
713
|
+
"Returns the product of x and y, both int or long.
|
714
|
+
Note - uses a primitive operator subject to overflow."
|
715
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (unchecked_multiply ~x ~y)))}
|
716
|
+
[x y] (. clojure.lang.Numbers (unchecked_multiply x y)))
|
717
|
+
|
718
|
+
(defn unchecked-divide
|
719
|
+
"Returns the division of x by y, both int or long.
|
720
|
+
Note - uses a primitive operator subject to truncation."
|
721
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (unchecked_divide ~x ~y)))}
|
722
|
+
[x y] (. clojure.lang.Numbers (unchecked_divide x y)))
|
723
|
+
|
724
|
+
(defn unchecked-remainder
|
725
|
+
"Returns the remainder of division of x by y, both int or long.
|
726
|
+
Note - uses a primitive operator subject to truncation."
|
727
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (unchecked_remainder ~x ~y)))}
|
728
|
+
[x y] (. clojure.lang.Numbers (unchecked_remainder x y)))
|
729
|
+
|
730
|
+
(defn pos?
|
731
|
+
"Returns true if num is greater than zero, else false"
|
732
|
+
{:tag Boolean
|
733
|
+
:inline (fn [x] `(. clojure.lang.Numbers (isPos ~x)))}
|
734
|
+
[x] (. clojure.lang.Numbers (isPos x)))
|
735
|
+
|
736
|
+
(defn neg?
|
737
|
+
"Returns true if num is less than zero, else false"
|
738
|
+
{:tag Boolean
|
739
|
+
:inline (fn [x] `(. clojure.lang.Numbers (isNeg ~x)))}
|
740
|
+
[x] (. clojure.lang.Numbers (isNeg x)))
|
741
|
+
|
742
|
+
(defn zero?
|
743
|
+
"Returns true if num is zero, else false"
|
744
|
+
{:tag Boolean
|
745
|
+
:inline (fn [x] `(. clojure.lang.Numbers (isZero ~x)))}
|
746
|
+
[x] (. clojure.lang.Numbers (isZero x)))
|
747
|
+
|
748
|
+
(defn quot
|
749
|
+
"quot[ient] of dividing numerator by denominator."
|
750
|
+
[num div]
|
751
|
+
(. clojure.lang.Numbers (quotient num div)))
|
752
|
+
|
753
|
+
(defn rem
|
754
|
+
"remainder of dividing numerator by denominator."
|
755
|
+
[num div]
|
756
|
+
(. clojure.lang.Numbers (remainder num div)))
|
757
|
+
|
758
|
+
(defn rationalize
|
759
|
+
"returns the rational value of num"
|
760
|
+
[num]
|
761
|
+
(. clojure.lang.Numbers (rationalize num)))
|
762
|
+
|
763
|
+
;;Bit ops
|
764
|
+
|
765
|
+
(defn bit-not
|
766
|
+
"Bitwise complement"
|
767
|
+
{:inline (fn [x] `(. clojure.lang.Numbers (not ~x)))}
|
768
|
+
[x] (. clojure.lang.Numbers not x))
|
769
|
+
|
770
|
+
|
771
|
+
(defn bit-and
|
772
|
+
"Bitwise and"
|
773
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (and ~x ~y)))}
|
774
|
+
[x y] (. clojure.lang.Numbers and x y))
|
775
|
+
|
776
|
+
(defn bit-or
|
777
|
+
"Bitwise or"
|
778
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (or ~x ~y)))}
|
779
|
+
[x y] (. clojure.lang.Numbers or x y))
|
780
|
+
|
781
|
+
(defn bit-xor
|
782
|
+
"Bitwise exclusive or"
|
783
|
+
{:inline (fn [x y] `(. clojure.lang.Numbers (xor ~x ~y)))}
|
784
|
+
[x y] (. clojure.lang.Numbers xor x y))
|
785
|
+
|
786
|
+
(defn bit-and-not
|
787
|
+
"Bitwise and with complement"
|
788
|
+
[x y] (. clojure.lang.Numbers andNot x y))
|
789
|
+
|
790
|
+
|
791
|
+
(defn bit-clear
|
792
|
+
"Clear bit at index n"
|
793
|
+
[x n] (. clojure.lang.Numbers clearBit x n))
|
794
|
+
|
795
|
+
(defn bit-set
|
796
|
+
"Set bit at index n"
|
797
|
+
[x n] (. clojure.lang.Numbers setBit x n))
|
798
|
+
|
799
|
+
(defn bit-flip
|
800
|
+
"Flip bit at index n"
|
801
|
+
[x n] (. clojure.lang.Numbers flipBit x n))
|
802
|
+
|
803
|
+
(defn bit-test
|
804
|
+
"Test bit at index n"
|
805
|
+
[x n] (. clojure.lang.Numbers testBit x n))
|
806
|
+
|
807
|
+
|
808
|
+
(defn bit-shift-left
|
809
|
+
"Bitwise shift left"
|
810
|
+
[x n] (. clojure.lang.Numbers shiftLeft x n))
|
811
|
+
|
812
|
+
(defn bit-shift-right
|
813
|
+
"Bitwise shift right"
|
814
|
+
[x n] (. clojure.lang.Numbers shiftRight x n))
|
815
|
+
|
816
|
+
(defn even?
|
817
|
+
"Returns true if n is even, throws an exception if n is not an integer"
|
818
|
+
[n] (zero? (bit-and n 1)))
|
819
|
+
|
820
|
+
(defn odd?
|
821
|
+
"Returns true if n is odd, throws an exception if n is not an integer"
|
822
|
+
[n] (not (even? n)))
|
823
|
+
|
824
|
+
|
825
|
+
;;
|
826
|
+
|
827
|
+
(defn complement
|
828
|
+
"Takes a fn f and returns a fn that takes the same arguments as f,
|
829
|
+
has the same effects, if any, and returns the opposite truth value."
|
830
|
+
[f]
|
831
|
+
(fn
|
832
|
+
([] (not (f)))
|
833
|
+
([x] (not (f x)))
|
834
|
+
([x y] (not (f x y)))
|
835
|
+
([x y & zs] (not (apply f x y zs)))))
|
836
|
+
|
837
|
+
(defn constantly
|
838
|
+
"Returns a function that takes any number of arguments and returns x."
|
839
|
+
[x] (fn [& args] x))
|
840
|
+
|
841
|
+
(defn identity
|
842
|
+
"Returns its argument."
|
843
|
+
[x] x)
|
844
|
+
|
845
|
+
;;Collection stuff
|
846
|
+
|
847
|
+
|
848
|
+
|
849
|
+
(defn count
|
850
|
+
"Returns the number of items in the collection. (count nil) returns
|
851
|
+
0. Also works on strings, arrays, and Java Collections and Maps"
|
852
|
+
[coll] (. clojure.lang.RT (count coll)))
|
853
|
+
|
854
|
+
;;list stuff
|
855
|
+
(defn peek
|
856
|
+
"For a list or queue, same as first, for a vector, same as, but much
|
857
|
+
more efficient than, last. If the collection is empty, returns nil."
|
858
|
+
[coll] (. clojure.lang.RT (peek coll)))
|
859
|
+
|
860
|
+
(defn pop
|
861
|
+
"For a list or queue, returns a new list/queue without the first
|
862
|
+
item, for a vector, returns a new vector without the last item. If
|
863
|
+
the collection is empty, throws an exception. Note - not the same
|
864
|
+
as next/butlast."
|
865
|
+
[coll] (. clojure.lang.RT (pop coll)))
|
866
|
+
|
867
|
+
(defn nth
|
868
|
+
"Returns the value at the index. get returns nil if index out of
|
869
|
+
bounds, nth throws an exception unless not-found is supplied. nth
|
870
|
+
also works for strings, Java arrays, regex Matchers and Lists, and,
|
871
|
+
in O(n) time, for sequences."
|
872
|
+
([coll index] (. clojure.lang.RT (nth coll index)))
|
873
|
+
([coll index not-found] (. clojure.lang.RT (nth coll index not-found))))
|
874
|
+
|
875
|
+
;;map stuff
|
876
|
+
|
877
|
+
(defn contains?
|
878
|
+
"Returns true if key is present in the given collection, otherwise
|
879
|
+
returns false. Note that for numerically indexed collections like
|
880
|
+
vectors and Java arrays, this tests if the numeric key is within the
|
881
|
+
range of indexes. 'contains?' operates constant or logarithmic time;
|
882
|
+
it will not perform a linear search for a value. See also 'some'."
|
883
|
+
[coll key] (. clojure.lang.RT (contains coll key)))
|
884
|
+
|
885
|
+
(defn get
|
886
|
+
"Returns the value mapped to key, not-found or nil if key not present."
|
887
|
+
([map key]
|
888
|
+
(. clojure.lang.RT (get map key)))
|
889
|
+
([map key not-found]
|
890
|
+
(. clojure.lang.RT (get map key not-found))))
|
891
|
+
|
892
|
+
(defn dissoc
|
893
|
+
"dissoc[iate]. Returns a new map of the same (hashed/sorted) type,
|
894
|
+
that does not contain a mapping for key(s)."
|
895
|
+
([map] map)
|
896
|
+
([map key]
|
897
|
+
(. clojure.lang.RT (dissoc map key)))
|
898
|
+
([map key & ks]
|
899
|
+
(let [ret (dissoc map key)]
|
900
|
+
(if ks
|
901
|
+
(recur ret (first ks) (next ks))
|
902
|
+
ret))))
|
903
|
+
|
904
|
+
(defn disj
|
905
|
+
"disj[oin]. Returns a new set of the same (hashed/sorted) type, that
|
906
|
+
does not contain key(s)."
|
907
|
+
([set] set)
|
908
|
+
([#^clojure.lang.IPersistentSet set key]
|
909
|
+
(. set (disjoin key)))
|
910
|
+
([set key & ks]
|
911
|
+
(let [ret (disj set key)]
|
912
|
+
(if ks
|
913
|
+
(recur ret (first ks) (next ks))
|
914
|
+
ret))))
|
915
|
+
|
916
|
+
(defn find
|
917
|
+
"Returns the map entry for key, or nil if key not present."
|
918
|
+
[map key] (. clojure.lang.RT (find map key)))
|
919
|
+
|
920
|
+
(defn select-keys
|
921
|
+
"Returns a map containing only those entries in map whose key is in keys"
|
922
|
+
[map keyseq]
|
923
|
+
(loop [ret {} keys (seq keyseq)]
|
924
|
+
(if keys
|
925
|
+
(let [entry (. clojure.lang.RT (find map (first keys)))]
|
926
|
+
(recur
|
927
|
+
(if entry
|
928
|
+
(conj ret entry)
|
929
|
+
ret)
|
930
|
+
(next keys)))
|
931
|
+
ret)))
|
932
|
+
|
933
|
+
(defn keys
|
934
|
+
"Returns a sequence of the map's keys."
|
935
|
+
[map] (. clojure.lang.RT (keys map)))
|
936
|
+
|
937
|
+
(defn vals
|
938
|
+
"Returns a sequence of the map's values."
|
939
|
+
[map] (. clojure.lang.RT (vals map)))
|
940
|
+
|
941
|
+
(defn key
|
942
|
+
"Returns the key of the map entry."
|
943
|
+
[#^java.util.Map$Entry e]
|
944
|
+
(. e (getKey)))
|
945
|
+
|
946
|
+
(defn val
|
947
|
+
"Returns the value in the map entry."
|
948
|
+
[#^java.util.Map$Entry e]
|
949
|
+
(. e (getValue)))
|
950
|
+
|
951
|
+
(defn rseq
|
952
|
+
"Returns, in constant time, a seq of the items in rev (which
|
953
|
+
can be a vector or sorted-map), in reverse order. If rev is empty returns nil"
|
954
|
+
[#^clojure.lang.Reversible rev]
|
955
|
+
(. rev (rseq)))
|
956
|
+
|
957
|
+
(defn name
|
958
|
+
"Returns the name String of a symbol or keyword."
|
959
|
+
{:tag String}
|
960
|
+
[#^clojure.lang.Named x]
|
961
|
+
(. x (getName)))
|
962
|
+
|
963
|
+
(defn namespace
|
964
|
+
"Returns the namespace String of a symbol or keyword, or nil if not present."
|
965
|
+
{:tag String}
|
966
|
+
[#^clojure.lang.Named x]
|
967
|
+
(. x (getNamespace)))
|
968
|
+
|
969
|
+
(defmacro locking
|
970
|
+
"Executes exprs in an implicit do, while holding the monitor of x.
|
971
|
+
Will release the monitor of x in all circumstances."
|
972
|
+
[x & body]
|
973
|
+
`(let [lockee# ~x]
|
974
|
+
(try
|
975
|
+
(monitor-enter lockee#)
|
976
|
+
~@body
|
977
|
+
(finally
|
978
|
+
(monitor-exit lockee#)))))
|
979
|
+
|
980
|
+
(defmacro ..
|
981
|
+
"form => fieldName-symbol or (instanceMethodName-symbol args*)
|
982
|
+
|
983
|
+
Expands into a member access (.) of the first member on the first
|
984
|
+
argument, followed by the next member on the result, etc. For
|
985
|
+
instance:
|
986
|
+
|
987
|
+
(.. System (getProperties) (get \"os.name\"))
|
988
|
+
|
989
|
+
expands to:
|
990
|
+
|
991
|
+
(. (. System (getProperties)) (get \"os.name\"))
|
992
|
+
|
993
|
+
but is easier to write, read, and understand."
|
994
|
+
([x form] `(. ~x ~form))
|
995
|
+
([x form & more] `(.. (. ~x ~form) ~@more)))
|
996
|
+
|
997
|
+
(defmacro ->
|
998
|
+
"Threads the expr through the forms. Inserts x as the
|
999
|
+
second item in the first form, making a list of it if it is not a
|
1000
|
+
list already. If there are more forms, inserts the first form as the
|
1001
|
+
second item in second form, etc."
|
1002
|
+
([x form] (if (seq? form)
|
1003
|
+
`(~(first form) ~x ~@(next form))
|
1004
|
+
(list form x)))
|
1005
|
+
([x form & more] `(-> (-> ~x ~form) ~@more)))
|
1006
|
+
|
1007
|
+
;;multimethods
|
1008
|
+
(def global-hierarchy)
|
1009
|
+
|
1010
|
+
(defmacro defmulti
|
1011
|
+
"Creates a new multimethod with the associated dispatch function.
|
1012
|
+
The docstring and attribute-map are optional.
|
1013
|
+
|
1014
|
+
Options are key-value pairs and may be one of:
|
1015
|
+
:default the default dispatch value, defaults to :default
|
1016
|
+
:hierarchy the isa? hierarchy to use for dispatching
|
1017
|
+
defaults to the global hierarchy"
|
1018
|
+
{:arglists '([name docstring? attr-map? dispatch-fn & options])}
|
1019
|
+
[mm-name & options]
|
1020
|
+
(let [docstring (if (string? (first options))
|
1021
|
+
(first options)
|
1022
|
+
nil)
|
1023
|
+
options (if (string? (first options))
|
1024
|
+
(next options)
|
1025
|
+
options)
|
1026
|
+
m (if (map? (first options))
|
1027
|
+
(first options)
|
1028
|
+
{})
|
1029
|
+
options (if (map? (first options))
|
1030
|
+
(next options)
|
1031
|
+
options)
|
1032
|
+
dispatch-fn (first options)
|
1033
|
+
options (next options)
|
1034
|
+
m (assoc m :tag 'clojure.lang.MultiFn)
|
1035
|
+
m (if docstring
|
1036
|
+
(assoc m :doc docstring)
|
1037
|
+
m)
|
1038
|
+
m (if (meta mm-name)
|
1039
|
+
(conj (meta mm-name) m)
|
1040
|
+
m)]
|
1041
|
+
(when (= (count options) 1)
|
1042
|
+
(throw (Exception. "The syntax for defmulti has changed. Example: (defmulti name dispatch-fn :default dispatch-value)")))
|
1043
|
+
(let [options (apply hash-map options)
|
1044
|
+
default (get options :default :default)
|
1045
|
+
hierarchy (get options :hierarchy #'global-hierarchy)]
|
1046
|
+
`(def ~(with-meta mm-name m)
|
1047
|
+
(new clojure.lang.MultiFn ~(name mm-name) ~dispatch-fn ~default ~hierarchy)))))
|
1048
|
+
|
1049
|
+
(defmacro defmethod
|
1050
|
+
"Creates and installs a new method of multimethod associated with dispatch-value. "
|
1051
|
+
[multifn dispatch-val & fn-tail]
|
1052
|
+
`(. ~multifn addMethod ~dispatch-val (fn ~@fn-tail)))
|
1053
|
+
|
1054
|
+
(defn remove-method
|
1055
|
+
"Removes the method of multimethod associated with dispatch-value."
|
1056
|
+
[#^clojure.lang.MultiFn multifn dispatch-val]
|
1057
|
+
(. multifn removeMethod dispatch-val))
|
1058
|
+
|
1059
|
+
(defn prefer-method
|
1060
|
+
"Causes the multimethod to prefer matches of dispatch-val-x over dispatch-val-y when there is a conflict"
|
1061
|
+
[#^clojure.lang.MultiFn multifn dispatch-val-x dispatch-val-y]
|
1062
|
+
(. multifn preferMethod dispatch-val-x dispatch-val-y))
|
1063
|
+
|
1064
|
+
(defn methods
|
1065
|
+
"Given a multimethod, returns a map of dispatch values -> dispatch fns"
|
1066
|
+
[#^clojure.lang.MultiFn multifn] (.getMethodTable multifn))
|
1067
|
+
|
1068
|
+
(defn get-method
|
1069
|
+
"Given a multimethod and a dispatch value, returns the dispatch fn
|
1070
|
+
that would apply to that value, or nil if none apply and no default"
|
1071
|
+
[#^clojure.lang.MultiFn multifn dispatch-val] (.getMethod multifn dispatch-val))
|
1072
|
+
|
1073
|
+
(defn prefers
|
1074
|
+
"Given a multimethod, returns a map of preferred value -> set of other values"
|
1075
|
+
[#^clojure.lang.MultiFn multifn] (.getPreferTable multifn))
|
1076
|
+
|
1077
|
+
;;;;;;;;; var stuff
|
1078
|
+
|
1079
|
+
(defmacro #^{:private true} assert-args [fnname & pairs]
|
1080
|
+
`(do (when-not ~(first pairs)
|
1081
|
+
(throw (IllegalArgumentException.
|
1082
|
+
~(str fnname " requires " (second pairs)))))
|
1083
|
+
~(let [more (nnext pairs)]
|
1084
|
+
(when more
|
1085
|
+
(list* `assert-args fnname more)))))
|
1086
|
+
|
1087
|
+
(defmacro if-let
|
1088
|
+
"bindings => binding-form test
|
1089
|
+
|
1090
|
+
If test is true, evaluates then with binding-form bound to the value of test, if not, yields else"
|
1091
|
+
([bindings then]
|
1092
|
+
`(if-let ~bindings ~then nil))
|
1093
|
+
([bindings then else & oldform]
|
1094
|
+
(assert-args if-let
|
1095
|
+
(and (vector? bindings) (nil? oldform)) "a vector for its binding"
|
1096
|
+
(= 2 (count bindings)) "exactly 2 forms in binding vector")
|
1097
|
+
(let [form (bindings 0) tst (bindings 1)]
|
1098
|
+
`(let [temp# ~tst]
|
1099
|
+
(if temp#
|
1100
|
+
(let [~form temp#]
|
1101
|
+
~then)
|
1102
|
+
~else)))))
|
1103
|
+
|
1104
|
+
(defmacro when-let
|
1105
|
+
"bindings => binding-form test
|
1106
|
+
|
1107
|
+
When test is true, evaluates body with binding-form bound to the value of test"
|
1108
|
+
[bindings & body]
|
1109
|
+
(assert-args when-let
|
1110
|
+
(vector? bindings) "a vector for its binding"
|
1111
|
+
(= 2 (count bindings)) "exactly 2 forms in binding vector")
|
1112
|
+
(let [form (bindings 0) tst (bindings 1)]
|
1113
|
+
`(let [temp# ~tst]
|
1114
|
+
(when temp#
|
1115
|
+
(let [~form temp#]
|
1116
|
+
~@body)))))
|
1117
|
+
|
1118
|
+
(defmacro binding
|
1119
|
+
"binding => var-symbol init-expr
|
1120
|
+
|
1121
|
+
Creates new bindings for the (already-existing) vars, with the
|
1122
|
+
supplied initial values, executes the exprs in an implicit do, then
|
1123
|
+
re-establishes the bindings that existed before."
|
1124
|
+
[bindings & body]
|
1125
|
+
(assert-args binding
|
1126
|
+
(vector? bindings) "a vector for its binding"
|
1127
|
+
(even? (count bindings)) "an even number of forms in binding vector")
|
1128
|
+
(let [var-ize (fn [var-vals]
|
1129
|
+
(loop [ret [] vvs (seq var-vals)]
|
1130
|
+
(if vvs
|
1131
|
+
(recur (conj (conj ret `(var ~(first vvs))) (second vvs))
|
1132
|
+
(next (next vvs)))
|
1133
|
+
(seq ret))))]
|
1134
|
+
`(do
|
1135
|
+
(. clojure.lang.Var (pushThreadBindings (hash-map ~@(var-ize bindings))))
|
1136
|
+
(try
|
1137
|
+
~@body
|
1138
|
+
(finally
|
1139
|
+
(. clojure.lang.Var (popThreadBindings)))))))
|
1140
|
+
|
1141
|
+
(defn find-var
|
1142
|
+
"Returns the global var named by the namespace-qualified symbol, or
|
1143
|
+
nil if no var with that name."
|
1144
|
+
[sym] (. clojure.lang.Var (find sym)))
|
1145
|
+
|
1146
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Refs ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
1147
|
+
(defn #^{:private true}
|
1148
|
+
setup-reference [#^clojure.lang.ARef r options]
|
1149
|
+
(let [opts (apply hash-map options)]
|
1150
|
+
(when (:meta opts)
|
1151
|
+
(.resetMeta r (:meta opts)))
|
1152
|
+
(when (:validator opts)
|
1153
|
+
(.setValidator r (:validator opts)))
|
1154
|
+
r))
|
1155
|
+
|
1156
|
+
(defn agent
|
1157
|
+
"Creates and returns an agent with an initial value of state and
|
1158
|
+
zero or more options (in any order):
|
1159
|
+
|
1160
|
+
:meta metadata-map
|
1161
|
+
|
1162
|
+
:validator validate-fn
|
1163
|
+
|
1164
|
+
If metadata-map is supplied, it will be come the metadata on the
|
1165
|
+
agent. validate-fn must be nil or a side-effect-free fn of one
|
1166
|
+
argument, which will be passed the intended new state on any state
|
1167
|
+
change. If the new state is unacceptable, the validate-fn should
|
1168
|
+
return false or throw an exception."
|
1169
|
+
([state] (new clojure.lang.Agent state))
|
1170
|
+
([state & options]
|
1171
|
+
(setup-reference (agent state) options)))
|
1172
|
+
|
1173
|
+
(defn send
|
1174
|
+
"Dispatch an action to an agent. Returns the agent immediately.
|
1175
|
+
Subsequently, in a thread from a thread pool, the state of the agent
|
1176
|
+
will be set to the value of:
|
1177
|
+
|
1178
|
+
(apply action-fn state-of-agent args)"
|
1179
|
+
[#^clojure.lang.Agent a f & args]
|
1180
|
+
(. a (dispatch f args false)))
|
1181
|
+
|
1182
|
+
(defn send-off
|
1183
|
+
"Dispatch a potentially blocking action to an agent. Returns the
|
1184
|
+
agent immediately. Subsequently, in a separate thread, the state of
|
1185
|
+
the agent will be set to the value of:
|
1186
|
+
|
1187
|
+
(apply action-fn state-of-agent args)"
|
1188
|
+
[#^clojure.lang.Agent a f & args]
|
1189
|
+
(. a (dispatch f args true)))
|
1190
|
+
|
1191
|
+
(defn release-pending-sends
|
1192
|
+
"Normally, actions sent directly or indirectly during another action
|
1193
|
+
are held until the action completes (changes the agent's
|
1194
|
+
state). This function can be used to dispatch any pending sent
|
1195
|
+
actions immediately. This has no impact on actions sent during a
|
1196
|
+
transaction, which are still held until commit. If no action is
|
1197
|
+
occurring, does nothing. Returns the number of actions dispatched."
|
1198
|
+
[] (clojure.lang.Agent/releasePendingSends))
|
1199
|
+
|
1200
|
+
(defn add-watch
|
1201
|
+
"Experimental.
|
1202
|
+
Adds a watch function to an agent/atom/var/ref reference. The watch
|
1203
|
+
fn must be a fn of 4 args: a key, the reference, its old-state, its
|
1204
|
+
new-state. Whenever the reference's state might have been changed,
|
1205
|
+
any registered watches will have their functions called. The watch fn
|
1206
|
+
will be called synchronously, on the agent's thread if an agent,
|
1207
|
+
before any pending sends if agent or ref. Note that an atom's or
|
1208
|
+
ref's state may have changed again prior to the fn call, so use
|
1209
|
+
old/new-state rather than derefing the reference. Note also that watch
|
1210
|
+
fns may be called from multiple threads simultaneously. Var watchers
|
1211
|
+
are triggered only by root binding changes, not thread-local
|
1212
|
+
set!s. Keys must be unique per reference, and can be used to remove
|
1213
|
+
the watch with remove-watch, but are otherwise considered opaque by
|
1214
|
+
the watch mechanism."
|
1215
|
+
[#^clojure.lang.IRef reference key fn] (.addWatch reference key fn))
|
1216
|
+
|
1217
|
+
(defn remove-watch
|
1218
|
+
"Experimental.
|
1219
|
+
Removes a watch (set by add-watch) from a reference"
|
1220
|
+
[#^clojure.lang.IRef reference key]
|
1221
|
+
(.removeWatch reference key))
|
1222
|
+
|
1223
|
+
(defn add-watcher
|
1224
|
+
"Experimental.
|
1225
|
+
Adds a watcher to an agent/atom/var/ref reference. The watcher must
|
1226
|
+
be an Agent, and the action a function of the agent's state and one
|
1227
|
+
additional arg, the reference. Whenever the reference's state
|
1228
|
+
changes, any registered watchers will have their actions
|
1229
|
+
sent. send-type must be one of :send or :send-off. The actions will
|
1230
|
+
be sent after the reference's state is changed. Var watchers are
|
1231
|
+
triggered only by root binding changes, not thread-local set!s"
|
1232
|
+
[#^clojure.lang.IRef reference send-type watcher-agent action-fn]
|
1233
|
+
(add-watch reference watcher-agent
|
1234
|
+
(fn [watcher-agent reference old-state new-state]
|
1235
|
+
(when-not (identical? old-state new-state)
|
1236
|
+
((if (= send-type :send-off) send-off send)
|
1237
|
+
watcher-agent action-fn reference)))))
|
1238
|
+
|
1239
|
+
(defn remove-watcher
|
1240
|
+
"Experimental.
|
1241
|
+
Removes a watcher (set by add-watcher) from a reference"
|
1242
|
+
[reference watcher-agent]
|
1243
|
+
(remove-watch reference watcher-agent))
|
1244
|
+
|
1245
|
+
(defn agent-errors
|
1246
|
+
"Returns a sequence of the exceptions thrown during asynchronous
|
1247
|
+
actions of the agent."
|
1248
|
+
[#^clojure.lang.Agent a] (. a (getErrors)))
|
1249
|
+
|
1250
|
+
(defn clear-agent-errors
|
1251
|
+
"Clears any exceptions thrown during asynchronous actions of the
|
1252
|
+
agent, allowing subsequent actions to occur."
|
1253
|
+
[#^clojure.lang.Agent a] (. a (clearErrors)))
|
1254
|
+
|
1255
|
+
(defn shutdown-agents
|
1256
|
+
"Initiates a shutdown of the thread pools that back the agent
|
1257
|
+
system. Running actions will complete, but no new actions will be
|
1258
|
+
accepted"
|
1259
|
+
[] (. clojure.lang.Agent shutdown))
|
1260
|
+
|
1261
|
+
(defn ref
|
1262
|
+
"Creates and returns a Ref with an initial value of x and zero or
|
1263
|
+
more options (in any order):
|
1264
|
+
|
1265
|
+
:meta metadata-map
|
1266
|
+
|
1267
|
+
:validator validate-fn
|
1268
|
+
|
1269
|
+
If metadata-map is supplied, it will be come the metadata on the
|
1270
|
+
ref. validate-fn must be nil or a side-effect-free fn of one
|
1271
|
+
argument, which will be passed the intended new state on any state
|
1272
|
+
change. If the new state is unacceptable, the validate-fn should
|
1273
|
+
return false or throw an exception. validate-fn will be called on
|
1274
|
+
transaction commit, when all refs have their final values."
|
1275
|
+
([x] (new clojure.lang.Ref x))
|
1276
|
+
([x & options] (setup-reference (ref x) options)))
|
1277
|
+
|
1278
|
+
(defn deref
|
1279
|
+
"Also reader macro: @ref/@agent/@var/@atom/@delay/@future. Within a transaction,
|
1280
|
+
returns the in-transaction-value of ref, else returns the
|
1281
|
+
most-recently-committed value of ref. When applied to a var, agent
|
1282
|
+
or atom, returns its current state. When applied to a delay, forces
|
1283
|
+
it if not already forced. When applied to a future, will block if
|
1284
|
+
computation not complete"
|
1285
|
+
[#^clojure.lang.IDeref ref] (.deref ref))
|
1286
|
+
|
1287
|
+
(defn atom
|
1288
|
+
"Creates and returns an Atom with an initial value of x and zero or
|
1289
|
+
more options (in any order):
|
1290
|
+
|
1291
|
+
:meta metadata-map
|
1292
|
+
|
1293
|
+
:validator validate-fn
|
1294
|
+
|
1295
|
+
If metadata-map is supplied, it will be come the metadata on the
|
1296
|
+
atom. validate-fn must be nil or a side-effect-free fn of one
|
1297
|
+
argument, which will be passed the intended new state on any state
|
1298
|
+
change. If the new state is unacceptable, the validate-fn should
|
1299
|
+
return false or throw an exception."
|
1300
|
+
([x] (new clojure.lang.Atom x))
|
1301
|
+
([x & options] (setup-reference (atom x) options)))
|
1302
|
+
|
1303
|
+
(defn swap!
|
1304
|
+
"Atomically swaps the value of atom to be:
|
1305
|
+
(apply f current-value-of-atom args). Note that f may be called
|
1306
|
+
multiple times, and thus should be free of side effects. Returns
|
1307
|
+
the value that was swapped in."
|
1308
|
+
([#^clojure.lang.Atom atom f] (.swap atom f))
|
1309
|
+
([#^clojure.lang.Atom atom f x] (.swap atom f x))
|
1310
|
+
([#^clojure.lang.Atom atom f x y] (.swap atom f x y))
|
1311
|
+
([#^clojure.lang.Atom atom f x y & args] (.swap atom f x y args)))
|
1312
|
+
|
1313
|
+
(defn compare-and-set!
|
1314
|
+
"Atomically sets the value of atom to newval if and only if the
|
1315
|
+
current value of the atom is identical to oldval. Returns true if
|
1316
|
+
set happened, else false"
|
1317
|
+
[#^clojure.lang.Atom atom oldval newval] (.compareAndSet atom oldval newval))
|
1318
|
+
|
1319
|
+
(defn reset!
|
1320
|
+
"Sets the value of atom to newval without regard for the
|
1321
|
+
current value. Returns newval."
|
1322
|
+
[#^clojure.lang.Atom atom newval] (.reset atom newval))
|
1323
|
+
|
1324
|
+
(defn set-validator!
|
1325
|
+
"Sets the validator-fn for a var/ref/agent/atom. validator-fn must be nil or a
|
1326
|
+
side-effect-free fn of one argument, which will be passed the intended
|
1327
|
+
new state on any state change. If the new state is unacceptable, the
|
1328
|
+
validator-fn should return false or throw an exception. If the current state (root
|
1329
|
+
value if var) is not acceptable to the new validator, an exception
|
1330
|
+
will be thrown and the validator will not be changed."
|
1331
|
+
[#^clojure.lang.IRef iref validator-fn] (. iref (setValidator validator-fn)))
|
1332
|
+
|
1333
|
+
(defn get-validator
|
1334
|
+
"Gets the validator-fn for a var/ref/agent/atom."
|
1335
|
+
[#^clojure.lang.IRef iref] (. iref (getValidator)))
|
1336
|
+
|
1337
|
+
(defn alter-meta!
|
1338
|
+
"Atomically sets the metadata for a namespace/var/ref/agent/atom to be:
|
1339
|
+
|
1340
|
+
(apply f its-current-meta args)
|
1341
|
+
|
1342
|
+
f must be free of side-effects"
|
1343
|
+
[#^clojure.lang.IReference iref f & args] (.alterMeta iref f args))
|
1344
|
+
|
1345
|
+
(defn reset-meta!
|
1346
|
+
"Atomically resets the metadata for a namespace/var/ref/agent/atom"
|
1347
|
+
[#^clojure.lang.IReference iref metadata-map] (.resetMeta iref metadata-map))
|
1348
|
+
|
1349
|
+
(defn commute
|
1350
|
+
"Must be called in a transaction. Sets the in-transaction-value of
|
1351
|
+
ref to:
|
1352
|
+
|
1353
|
+
(apply fun in-transaction-value-of-ref args)
|
1354
|
+
|
1355
|
+
and returns the in-transaction-value of ref.
|
1356
|
+
|
1357
|
+
At the commit point of the transaction, sets the value of ref to be:
|
1358
|
+
|
1359
|
+
(apply fun most-recently-committed-value-of-ref args)
|
1360
|
+
|
1361
|
+
Thus fun should be commutative, or, failing that, you must accept
|
1362
|
+
last-one-in-wins behavior. commute allows for more concurrency than
|
1363
|
+
ref-set."
|
1364
|
+
|
1365
|
+
[#^clojure.lang.Ref ref fun & args]
|
1366
|
+
(. ref (commute fun args)))
|
1367
|
+
|
1368
|
+
(defn alter
|
1369
|
+
"Must be called in a transaction. Sets the in-transaction-value of
|
1370
|
+
ref to:
|
1371
|
+
|
1372
|
+
(apply fun in-transaction-value-of-ref args)
|
1373
|
+
|
1374
|
+
and returns the in-transaction-value of ref."
|
1375
|
+
[#^clojure.lang.Ref ref fun & args]
|
1376
|
+
(. ref (alter fun args)))
|
1377
|
+
|
1378
|
+
(defn ref-set
|
1379
|
+
"Must be called in a transaction. Sets the value of ref.
|
1380
|
+
Returns val."
|
1381
|
+
[#^clojure.lang.Ref ref val]
|
1382
|
+
(. ref (set val)))
|
1383
|
+
|
1384
|
+
(defn ensure
|
1385
|
+
"Must be called in a transaction. Protects the ref from modification
|
1386
|
+
by other transactions. Returns the in-transaction-value of
|
1387
|
+
ref. Allows for more concurrency than (ref-set ref @ref)"
|
1388
|
+
[#^clojure.lang.Ref ref]
|
1389
|
+
(. ref (touch))
|
1390
|
+
(. ref (deref)))
|
1391
|
+
|
1392
|
+
(defmacro sync
|
1393
|
+
"transaction-flags => TBD, pass nil for now
|
1394
|
+
|
1395
|
+
Runs the exprs (in an implicit do) in a transaction that encompasses
|
1396
|
+
exprs and any nested calls. Starts a transaction if none is already
|
1397
|
+
running on this thread. Any uncaught exception will abort the
|
1398
|
+
transaction and flow out of sync. The exprs may be run more than
|
1399
|
+
once, but any effects on Refs will be atomic."
|
1400
|
+
[flags-ignored-for-now & body]
|
1401
|
+
`(. clojure.lang.LockingTransaction
|
1402
|
+
(runInTransaction (fn [] ~@body))))
|
1403
|
+
|
1404
|
+
|
1405
|
+
(defmacro io!
|
1406
|
+
"If an io! block occurs in a transaction, throws an
|
1407
|
+
IllegalStateException, else runs body in an implicit do. If the
|
1408
|
+
first expression in body is a literal string, will use that as the
|
1409
|
+
exception message."
|
1410
|
+
[& body]
|
1411
|
+
(let [message (when (string? (first body)) (first body))
|
1412
|
+
body (if message (next body) body)]
|
1413
|
+
`(if (clojure.lang.LockingTransaction/isRunning)
|
1414
|
+
(throw (new IllegalStateException ~(or message "I/O in transaction")))
|
1415
|
+
(do ~@body))))
|
1416
|
+
|
1417
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; fn stuff ;;;;;;;;;;;;;;;;
|
1418
|
+
|
1419
|
+
|
1420
|
+
(defn comp
|
1421
|
+
"Takes a set of functions and returns a fn that is the composition
|
1422
|
+
of those fns. The returned fn takes a variable number of args,
|
1423
|
+
applies the rightmost of fns to the args, the next
|
1424
|
+
fn (right-to-left) to the result, etc."
|
1425
|
+
[& fs]
|
1426
|
+
(let [fs (reverse fs)]
|
1427
|
+
(fn [& args]
|
1428
|
+
(loop [ret (apply (first fs) args) fs (next fs)]
|
1429
|
+
(if fs
|
1430
|
+
(recur ((first fs) ret) (next fs))
|
1431
|
+
ret)))))
|
1432
|
+
|
1433
|
+
(defn partial
|
1434
|
+
"Takes a function f and fewer than the normal arguments to f, and
|
1435
|
+
returns a fn that takes a variable number of additional args. When
|
1436
|
+
called, the returned function calls f with args + additional args."
|
1437
|
+
([f arg1]
|
1438
|
+
(fn [& args] (apply f arg1 args)))
|
1439
|
+
([f arg1 arg2]
|
1440
|
+
(fn [& args] (apply f arg1 arg2 args)))
|
1441
|
+
([f arg1 arg2 arg3]
|
1442
|
+
(fn [& args] (apply f arg1 arg2 arg3 args)))
|
1443
|
+
([f arg1 arg2 arg3 & more]
|
1444
|
+
(fn [& args] (apply f arg1 arg2 arg3 (concat more args)))))
|
1445
|
+
|
1446
|
+
;;;;;;;;;;;;;;;;;;; sequence fns ;;;;;;;;;;;;;;;;;;;;;;;
|
1447
|
+
(defn stream?
|
1448
|
+
"Returns true if x is an instance of Stream"
|
1449
|
+
[x] (instance? clojure.lang.Stream x))
|
1450
|
+
|
1451
|
+
|
1452
|
+
(defn sequence
|
1453
|
+
"Coerces coll to a (possibly empty) sequence, if it is not already
|
1454
|
+
one. Will not force a lazy seq. (sequence nil) yields ()"
|
1455
|
+
[coll]
|
1456
|
+
(cond
|
1457
|
+
(seq? coll) coll
|
1458
|
+
(stream? coll) (.sequence #^clojure.lang.Stream coll)
|
1459
|
+
:else (or (seq coll) ())))
|
1460
|
+
|
1461
|
+
(defn every?
|
1462
|
+
"Returns true if (pred x) is logical true for every x in coll, else
|
1463
|
+
false."
|
1464
|
+
{:tag Boolean}
|
1465
|
+
[pred coll]
|
1466
|
+
(if (seq coll)
|
1467
|
+
(and (pred (first coll))
|
1468
|
+
(recur pred (next coll)))
|
1469
|
+
true))
|
1470
|
+
|
1471
|
+
(def
|
1472
|
+
#^{:tag Boolean
|
1473
|
+
:doc "Returns false if (pred x) is logical true for every x in
|
1474
|
+
coll, else true."
|
1475
|
+
:arglists '([pred coll])}
|
1476
|
+
not-every? (comp not every?))
|
1477
|
+
|
1478
|
+
(defn some
|
1479
|
+
"Returns the first logical true value of (pred x) for any x in coll,
|
1480
|
+
else nil. One common idiom is to use a set as pred, for example
|
1481
|
+
this will return true if :fred is in the sequence, otherwise nil:
|
1482
|
+
(some #{:fred} coll)"
|
1483
|
+
[pred coll]
|
1484
|
+
(when (seq coll)
|
1485
|
+
(or (pred (first coll)) (recur pred (next coll)))))
|
1486
|
+
|
1487
|
+
(def
|
1488
|
+
#^{:tag Boolean
|
1489
|
+
:doc "Returns false if (pred x) is logical true for any x in coll,
|
1490
|
+
else true."
|
1491
|
+
:arglists '([pred coll])}
|
1492
|
+
not-any? (comp not some))
|
1493
|
+
|
1494
|
+
(defn map
|
1495
|
+
"Returns a lazy sequence consisting of the result of applying f to the
|
1496
|
+
set of first items of each coll, followed by applying f to the set
|
1497
|
+
of second items in each coll, until any one of the colls is
|
1498
|
+
exhausted. Any remaining items in other colls are ignored. Function
|
1499
|
+
f should accept number-of-colls arguments."
|
1500
|
+
([f coll]
|
1501
|
+
(lazy-seq
|
1502
|
+
(when-let [s (seq coll)]
|
1503
|
+
(cons (f (first s)) (map f (rest s))))))
|
1504
|
+
([f c1 c2]
|
1505
|
+
(lazy-seq
|
1506
|
+
(let [s1 (seq c1) s2 (seq c2)]
|
1507
|
+
(when (and s1 s2)
|
1508
|
+
(cons (f (first s1) (first s2))
|
1509
|
+
(map f (rest s1) (rest s2)))))))
|
1510
|
+
([f c1 c2 c3]
|
1511
|
+
(lazy-seq
|
1512
|
+
(let [s1 (seq c1) s2 (seq c2) s3 (seq c3)]
|
1513
|
+
(when (and s1 s2 s3)
|
1514
|
+
(cons (f (first s1) (first s2) (first s3))
|
1515
|
+
(map f (rest s1) (rest s2) (rest s3)))))))
|
1516
|
+
([f c1 c2 c3 & colls]
|
1517
|
+
(let [step (fn step [cs]
|
1518
|
+
(lazy-seq
|
1519
|
+
(let [ss (map seq cs)]
|
1520
|
+
(when (every? identity ss)
|
1521
|
+
(cons (map first ss) (step (map rest ss)))))))]
|
1522
|
+
(map #(apply f %) (step (conj colls c3 c2 c1))))))
|
1523
|
+
|
1524
|
+
(defn mapcat
|
1525
|
+
"Returns the result of applying concat to the result of applying map
|
1526
|
+
to f and colls. Thus function f should return a collection."
|
1527
|
+
[f & colls]
|
1528
|
+
(apply concat (apply map f colls)))
|
1529
|
+
|
1530
|
+
(defn filter
|
1531
|
+
"Returns a lazy sequence of the items in coll for which
|
1532
|
+
(pred item) returns true. pred must be free of side-effects."
|
1533
|
+
[pred coll]
|
1534
|
+
(let [step (fn [p c]
|
1535
|
+
(when-let [s (seq c)]
|
1536
|
+
(if (p (first s))
|
1537
|
+
(cons (first s) (filter p (rest s)))
|
1538
|
+
(recur p (rest s)))))]
|
1539
|
+
(lazy-seq (step pred coll))))
|
1540
|
+
|
1541
|
+
|
1542
|
+
(defn remove
|
1543
|
+
"Returns a lazy sequence of the items in coll for which
|
1544
|
+
(pred item) returns false. pred must be free of side-effects."
|
1545
|
+
[pred coll]
|
1546
|
+
(filter (complement pred) coll))
|
1547
|
+
|
1548
|
+
(defn take
|
1549
|
+
"Returns a lazy sequence of the first n items in coll, or all items if
|
1550
|
+
there are fewer than n."
|
1551
|
+
[n coll]
|
1552
|
+
(lazy-seq
|
1553
|
+
(when (pos? n)
|
1554
|
+
(when-let [s (seq coll)]
|
1555
|
+
(cons (first s) (take (dec n) (rest s)))))))
|
1556
|
+
|
1557
|
+
(defn take-while
|
1558
|
+
"Returns a lazy sequence of successive items from coll while
|
1559
|
+
(pred item) returns true. pred must be free of side-effects."
|
1560
|
+
[pred coll]
|
1561
|
+
(lazy-seq
|
1562
|
+
(when-let [s (seq coll)]
|
1563
|
+
(when (pred (first s))
|
1564
|
+
(cons (first s) (take-while pred (rest s)))))))
|
1565
|
+
|
1566
|
+
(defn drop
|
1567
|
+
"Returns a lazy sequence of all but the first n items in coll."
|
1568
|
+
[n coll]
|
1569
|
+
(let [step (fn [n coll]
|
1570
|
+
(let [s (seq coll)]
|
1571
|
+
(if (and (pos? n) s)
|
1572
|
+
(recur (dec n) (rest s))
|
1573
|
+
s)))]
|
1574
|
+
(lazy-seq (step n coll))))
|
1575
|
+
|
1576
|
+
(defn drop-last
|
1577
|
+
"Return a lazy sequence of all but the last n (default 1) items in coll"
|
1578
|
+
([s] (drop-last 1 s))
|
1579
|
+
([n s] (map (fn [x _] x) s (drop n s))))
|
1580
|
+
|
1581
|
+
(defn drop-while
|
1582
|
+
"Returns a lazy sequence of the items in coll starting from the first
|
1583
|
+
item for which (pred item) returns nil."
|
1584
|
+
[pred coll]
|
1585
|
+
(let [step (fn [pred coll]
|
1586
|
+
(let [s (seq coll)]
|
1587
|
+
(if (and s (pred (first s)))
|
1588
|
+
(recur pred (rest s))
|
1589
|
+
s)))]
|
1590
|
+
(lazy-seq (step pred coll))))
|
1591
|
+
|
1592
|
+
(defn cycle
|
1593
|
+
"Returns a lazy (infinite!) sequence of repetitions of the items in coll."
|
1594
|
+
[coll] (lazy-seq
|
1595
|
+
(when-let [s (seq coll)]
|
1596
|
+
(concat s (cycle s)))))
|
1597
|
+
|
1598
|
+
(defn split-at
|
1599
|
+
"Returns a vector of [(take n coll) (drop n coll)]"
|
1600
|
+
[n coll]
|
1601
|
+
[(take n coll) (drop n coll)])
|
1602
|
+
|
1603
|
+
(defn split-with
|
1604
|
+
"Returns a vector of [(take-while pred coll) (drop-while pred coll)]"
|
1605
|
+
[pred coll]
|
1606
|
+
[(take-while pred coll) (drop-while pred coll)])
|
1607
|
+
|
1608
|
+
(defn repeat
|
1609
|
+
"Returns a lazy (infinite!, or length n if supplied) sequence of xs."
|
1610
|
+
([x] (lazy-seq (cons x (repeat x))))
|
1611
|
+
([n x] (take n (repeat x))))
|
1612
|
+
|
1613
|
+
(defn replicate
|
1614
|
+
"Returns a lazy seq of n xs."
|
1615
|
+
[n x] (take n (repeat x)))
|
1616
|
+
|
1617
|
+
(defn iterate
|
1618
|
+
"Returns a lazy sequence of x, (f x), (f (f x)) etc. f must be free of side-effects"
|
1619
|
+
[f x] (cons x (lazy-seq (iterate f (f x)))))
|
1620
|
+
|
1621
|
+
(defn range
|
1622
|
+
"Returns a lazy seq of nums from start (inclusive) to end
|
1623
|
+
(exclusive), by step, where start defaults to 0 and step to 1."
|
1624
|
+
([end] (if (and (> end 0) (<= end (. Integer MAX_VALUE)))
|
1625
|
+
(new clojure.lang.Range 0 end)
|
1626
|
+
(take end (iterate inc 0))))
|
1627
|
+
([start end] (if (and (< start end)
|
1628
|
+
(>= start (. Integer MIN_VALUE))
|
1629
|
+
(<= end (. Integer MAX_VALUE)))
|
1630
|
+
(new clojure.lang.Range start end)
|
1631
|
+
(take (- end start) (iterate inc start))))
|
1632
|
+
([start end step]
|
1633
|
+
(take-while (partial (if (pos? step) > <) end) (iterate (partial + step) start))))
|
1634
|
+
|
1635
|
+
(defn merge
|
1636
|
+
"Returns a map that consists of the rest of the maps conj-ed onto
|
1637
|
+
the first. If a key occurs in more than one map, the mapping from
|
1638
|
+
the latter (left-to-right) will be the mapping in the result."
|
1639
|
+
[& maps]
|
1640
|
+
(when (some identity maps)
|
1641
|
+
(reduce #(conj (or %1 {}) %2) maps)))
|
1642
|
+
|
1643
|
+
(defn merge-with
|
1644
|
+
"Returns a map that consists of the rest of the maps conj-ed onto
|
1645
|
+
the first. If a key occurs in more than one map, the mapping(s)
|
1646
|
+
from the latter (left-to-right) will be combined with the mapping in
|
1647
|
+
the result by calling (f val-in-result val-in-latter)."
|
1648
|
+
[f & maps]
|
1649
|
+
(when (some identity maps)
|
1650
|
+
(let [merge-entry (fn [m e]
|
1651
|
+
(let [k (key e) v (val e)]
|
1652
|
+
(if (contains? m k)
|
1653
|
+
(assoc m k (f (m k) v))
|
1654
|
+
(assoc m k v))))
|
1655
|
+
merge2 (fn [m1 m2]
|
1656
|
+
(reduce merge-entry (or m1 {}) (seq m2)))]
|
1657
|
+
(reduce merge2 maps))))
|
1658
|
+
|
1659
|
+
|
1660
|
+
|
1661
|
+
(defn zipmap
|
1662
|
+
"Returns a map with the keys mapped to the corresponding vals."
|
1663
|
+
[keys vals]
|
1664
|
+
(loop [map {}
|
1665
|
+
ks (seq keys)
|
1666
|
+
vs (seq vals)]
|
1667
|
+
(if (and ks vs)
|
1668
|
+
(recur (assoc map (first ks) (first vs))
|
1669
|
+
(next ks)
|
1670
|
+
(next vs))
|
1671
|
+
map)))
|
1672
|
+
|
1673
|
+
(defn line-seq
|
1674
|
+
"Returns the lines of text from rdr as a lazy sequence of strings.
|
1675
|
+
rdr must implement java.io.BufferedReader."
|
1676
|
+
[#^java.io.BufferedReader rdr]
|
1677
|
+
(lazy-seq
|
1678
|
+
(let [line (. rdr (readLine))]
|
1679
|
+
(when line
|
1680
|
+
(cons line (line-seq rdr))))))
|
1681
|
+
|
1682
|
+
(defn comparator
|
1683
|
+
"Returns an implementation of java.util.Comparator based upon pred."
|
1684
|
+
[pred]
|
1685
|
+
(fn [x y]
|
1686
|
+
(cond (pred x y) -1 (pred y x) 1 :else 0)))
|
1687
|
+
|
1688
|
+
(defn sort
|
1689
|
+
"Returns a sorted sequence of the items in coll. If no comparator is
|
1690
|
+
supplied, uses compare. comparator must
|
1691
|
+
implement java.util.Comparator."
|
1692
|
+
([coll]
|
1693
|
+
(sort compare coll))
|
1694
|
+
([#^java.util.Comparator comp coll]
|
1695
|
+
(if (seq coll)
|
1696
|
+
(let [a (to-array coll)]
|
1697
|
+
(. java.util.Arrays (sort a comp))
|
1698
|
+
(seq a))
|
1699
|
+
())))
|
1700
|
+
|
1701
|
+
(defn sort-by
|
1702
|
+
"Returns a sorted sequence of the items in coll, where the sort
|
1703
|
+
order is determined by comparing (keyfn item). If no comparator is
|
1704
|
+
supplied, uses compare. comparator must
|
1705
|
+
implement java.util.Comparator."
|
1706
|
+
([keyfn coll]
|
1707
|
+
(sort-by keyfn compare coll))
|
1708
|
+
([keyfn #^java.util.Comparator comp coll]
|
1709
|
+
(sort (fn [x y] (. comp (compare (keyfn x) (keyfn y)))) coll)))
|
1710
|
+
|
1711
|
+
(defn partition
|
1712
|
+
"Returns a lazy sequence of lists of n items each, at offsets step
|
1713
|
+
apart. If step is not supplied, defaults to n, i.e. the partitions
|
1714
|
+
do not overlap."
|
1715
|
+
([n coll]
|
1716
|
+
(partition n n coll))
|
1717
|
+
([n step coll]
|
1718
|
+
(lazy-seq
|
1719
|
+
(when-let [s (seq coll)]
|
1720
|
+
(let [p (take n s)]
|
1721
|
+
(when (= n (count p))
|
1722
|
+
(cons p (partition n step (drop step s)))))))))
|
1723
|
+
|
1724
|
+
;; evaluation
|
1725
|
+
|
1726
|
+
(defn eval
|
1727
|
+
"Evaluates the form data structure (not text!) and returns the result."
|
1728
|
+
[form] (. clojure.lang.Compiler (eval form)))
|
1729
|
+
|
1730
|
+
(defmacro doseq
|
1731
|
+
"Repeatedly executes body (presumably for side-effects) with
|
1732
|
+
bindings and filtering as provided by \"for\". Does not retain
|
1733
|
+
the head of the sequence. Returns nil."
|
1734
|
+
[seq-exprs & body]
|
1735
|
+
(assert-args doseq
|
1736
|
+
(vector? seq-exprs) "a vector for its binding"
|
1737
|
+
(even? (count seq-exprs)) "an even number of forms in binding vector")
|
1738
|
+
(let [step (fn step [recform exprs]
|
1739
|
+
(if-not exprs
|
1740
|
+
[true `(do ~@body)]
|
1741
|
+
(let [k (first exprs)
|
1742
|
+
v (second exprs)
|
1743
|
+
seqsym (when-not (keyword? k) (gensym))
|
1744
|
+
recform (if (keyword? k) recform `(recur (next ~seqsym)))
|
1745
|
+
steppair (step recform (nnext exprs))
|
1746
|
+
needrec (steppair 0)
|
1747
|
+
subform (steppair 1)]
|
1748
|
+
(cond
|
1749
|
+
(= k :let) [needrec `(let ~v ~subform)]
|
1750
|
+
(= k :while) [false `(when ~v
|
1751
|
+
~subform
|
1752
|
+
~@(when needrec [recform]))]
|
1753
|
+
(= k :when) [false `(if ~v
|
1754
|
+
(do
|
1755
|
+
~subform
|
1756
|
+
~@(when needrec [recform]))
|
1757
|
+
~recform)]
|
1758
|
+
:else [true `(loop [~seqsym (seq ~v)]
|
1759
|
+
(when ~seqsym
|
1760
|
+
(let [~k (first ~seqsym)]
|
1761
|
+
~subform
|
1762
|
+
~@(when needrec [recform]))))]))))]
|
1763
|
+
(nth (step nil (seq seq-exprs)) 1)))
|
1764
|
+
|
1765
|
+
(defn dorun
|
1766
|
+
"When lazy sequences are produced via functions that have side
|
1767
|
+
effects, any effects other than those needed to produce the first
|
1768
|
+
element in the seq do not occur until the seq is consumed. dorun can
|
1769
|
+
be used to force any effects. Walks through the successive nexts of
|
1770
|
+
the seq, does not retain the head and returns nil."
|
1771
|
+
([coll]
|
1772
|
+
(when (seq coll)
|
1773
|
+
(recur (next coll))))
|
1774
|
+
([n coll]
|
1775
|
+
(when (and (seq coll) (pos? n))
|
1776
|
+
(recur (dec n) (next coll)))))
|
1777
|
+
|
1778
|
+
(defn doall
|
1779
|
+
"When lazy sequences are produced via functions that have side
|
1780
|
+
effects, any effects other than those needed to produce the first
|
1781
|
+
element in the seq do not occur until the seq is consumed. doall can
|
1782
|
+
be used to force any effects. Walks through the successive nexts of
|
1783
|
+
the seq, retains the head and returns it, thus causing the entire
|
1784
|
+
seq to reside in memory at one time."
|
1785
|
+
([coll]
|
1786
|
+
(dorun coll)
|
1787
|
+
coll)
|
1788
|
+
([n coll]
|
1789
|
+
(dorun n coll)
|
1790
|
+
coll))
|
1791
|
+
|
1792
|
+
(defn await
|
1793
|
+
"Blocks the current thread (indefinitely!) until all actions
|
1794
|
+
dispatched thus far, from this thread or agent, to the agent(s) have
|
1795
|
+
occurred."
|
1796
|
+
[& agents]
|
1797
|
+
(io! "await in transaction"
|
1798
|
+
(when *agent*
|
1799
|
+
(throw (new Exception "Can't await in agent action")))
|
1800
|
+
(let [latch (new java.util.concurrent.CountDownLatch (count agents))
|
1801
|
+
count-down (fn [agent] (. latch (countDown)) agent)]
|
1802
|
+
(doseq [agent agents]
|
1803
|
+
(send agent count-down))
|
1804
|
+
(. latch (await)))))
|
1805
|
+
|
1806
|
+
(defn await1 [#^clojure.lang.Agent a]
|
1807
|
+
(when (pos? (.getQueueCount a))
|
1808
|
+
(await a))
|
1809
|
+
a)
|
1810
|
+
|
1811
|
+
(defn await-for
|
1812
|
+
"Blocks the current thread until all actions dispatched thus
|
1813
|
+
far (from this thread or agent) to the agents have occurred, or the
|
1814
|
+
timeout (in milliseconds) has elapsed. Returns nil if returning due
|
1815
|
+
to timeout, non-nil otherwise."
|
1816
|
+
[timeout-ms & agents]
|
1817
|
+
(io! "await-for in transaction"
|
1818
|
+
(when *agent*
|
1819
|
+
(throw (new Exception "Can't await in agent action")))
|
1820
|
+
(let [latch (new java.util.concurrent.CountDownLatch (count agents))
|
1821
|
+
count-down (fn [agent] (. latch (countDown)) agent)]
|
1822
|
+
(doseq [agent agents]
|
1823
|
+
(send agent count-down))
|
1824
|
+
(. latch (await timeout-ms (. java.util.concurrent.TimeUnit MILLISECONDS))))))
|
1825
|
+
|
1826
|
+
(defmacro dotimes
|
1827
|
+
"bindings => name n
|
1828
|
+
|
1829
|
+
Repeatedly executes body (presumably for side-effects) with name
|
1830
|
+
bound to integers from 0 through n-1."
|
1831
|
+
[bindings & body]
|
1832
|
+
(assert-args dotimes
|
1833
|
+
(vector? bindings) "a vector for its binding"
|
1834
|
+
(= 2 (count bindings)) "exactly 2 forms in binding vector")
|
1835
|
+
(let [i (first bindings)
|
1836
|
+
n (second bindings)]
|
1837
|
+
`(let [n# (int ~n)]
|
1838
|
+
(loop [~i (int 0)]
|
1839
|
+
(when (< ~i n#)
|
1840
|
+
~@body
|
1841
|
+
(recur (unchecked-inc ~i)))))))
|
1842
|
+
|
1843
|
+
(defn import
|
1844
|
+
"import-list => (package-symbol class-name-symbols*)
|
1845
|
+
|
1846
|
+
For each name in class-name-symbols, adds a mapping from name to the
|
1847
|
+
class named by package.name to the current namespace. Use :import in the ns
|
1848
|
+
macro in preference to calling this directly."
|
1849
|
+
[& import-symbols-or-lists]
|
1850
|
+
(let [#^clojure.lang.Namespace ns *ns*]
|
1851
|
+
(doseq [spec import-symbols-or-lists]
|
1852
|
+
(if (symbol? spec)
|
1853
|
+
(let [n (name spec)
|
1854
|
+
dot (.lastIndexOf n (. clojure.lang.RT (intCast \.)))
|
1855
|
+
c (symbol (.substring n (inc dot)))]
|
1856
|
+
(. ns (importClass c (. clojure.lang.RT (classForName (name spec))))))
|
1857
|
+
(let [pkg (first spec)
|
1858
|
+
classes (next spec)]
|
1859
|
+
(doseq [c classes]
|
1860
|
+
(. ns (importClass c (. clojure.lang.RT (classForName (str pkg "." c)))))))))))
|
1861
|
+
|
1862
|
+
|
1863
|
+
(defn into-array
|
1864
|
+
"Returns an array with components set to the values in aseq. The array's
|
1865
|
+
component type is type if provided, or the type of the first value in
|
1866
|
+
aseq if present, or Object. All values in aseq must be compatible with
|
1867
|
+
the component type. Class objects for the primitive types can be obtained
|
1868
|
+
using, e.g., Integer/TYPE."
|
1869
|
+
([aseq]
|
1870
|
+
(clojure.lang.RT/seqToTypedArray (seq aseq)))
|
1871
|
+
([type aseq]
|
1872
|
+
(clojure.lang.RT/seqToTypedArray type (seq aseq))))
|
1873
|
+
|
1874
|
+
(defn into
|
1875
|
+
"Returns a new coll consisting of to-coll with all of the items of
|
1876
|
+
from-coll conjoined."
|
1877
|
+
[to from]
|
1878
|
+
(let [ret to items (seq from)]
|
1879
|
+
(if items
|
1880
|
+
(recur (conj ret (first items)) (next items))
|
1881
|
+
ret)))
|
1882
|
+
|
1883
|
+
(defn #^{:private true}
|
1884
|
+
array [& items]
|
1885
|
+
(into-array items))
|
1886
|
+
|
1887
|
+
(defn #^Class class
|
1888
|
+
"Returns the Class of x"
|
1889
|
+
[#^Object x] (if (nil? x) x (. x (getClass))))
|
1890
|
+
|
1891
|
+
(defn type
|
1892
|
+
"Returns the :type metadata of x, or its Class if none"
|
1893
|
+
[x]
|
1894
|
+
(or (:type (meta x)) (class x)))
|
1895
|
+
|
1896
|
+
(defn num
|
1897
|
+
"Coerce to Number"
|
1898
|
+
{:tag Number
|
1899
|
+
:inline (fn [x] `(. clojure.lang.Numbers (num ~x)))}
|
1900
|
+
[x] (. clojure.lang.Numbers (num x)))
|
1901
|
+
|
1902
|
+
(defn int
|
1903
|
+
"Coerce to int"
|
1904
|
+
{:tag Integer
|
1905
|
+
:inline (fn [x] `(. clojure.lang.RT (intCast ~x)))}
|
1906
|
+
[x] (. clojure.lang.RT (intCast x)))
|
1907
|
+
|
1908
|
+
(defn long
|
1909
|
+
"Coerce to long"
|
1910
|
+
{:tag Long
|
1911
|
+
:inline (fn [x] `(. clojure.lang.RT (longCast ~x)))}
|
1912
|
+
[#^Number x] (. x (longValue)))
|
1913
|
+
|
1914
|
+
(defn float
|
1915
|
+
"Coerce to float"
|
1916
|
+
{:tag Float
|
1917
|
+
:inline (fn [x] `(. clojure.lang.RT (floatCast ~x)))}
|
1918
|
+
[#^Number x] (. x (floatValue)))
|
1919
|
+
|
1920
|
+
(defn double
|
1921
|
+
"Coerce to double"
|
1922
|
+
{:tag Double
|
1923
|
+
:inline (fn [x] `(. clojure.lang.RT (doubleCast ~x)))}
|
1924
|
+
[#^Number x] (. x (doubleValue)))
|
1925
|
+
|
1926
|
+
(defn short
|
1927
|
+
"Coerce to short"
|
1928
|
+
{:tag Short
|
1929
|
+
:inline (fn [x] `(. clojure.lang.RT (shortCast ~x)))}
|
1930
|
+
[#^Number x] (. x (shortValue)))
|
1931
|
+
|
1932
|
+
(defn byte
|
1933
|
+
"Coerce to byte"
|
1934
|
+
{:tag Byte
|
1935
|
+
:inline (fn [x] `(. clojure.lang.RT (byteCast ~x)))}
|
1936
|
+
[#^Number x] (. x (byteValue)))
|
1937
|
+
|
1938
|
+
(defn char
|
1939
|
+
"Coerce to char"
|
1940
|
+
{:tag Character
|
1941
|
+
:inline (fn [x] `(. clojure.lang.RT (charCast ~x)))}
|
1942
|
+
[x] (. clojure.lang.RT (charCast x)))
|
1943
|
+
|
1944
|
+
(defn boolean
|
1945
|
+
"Coerce to boolean"
|
1946
|
+
{:tag Boolean
|
1947
|
+
:inline (fn [x] `(. clojure.lang.RT (booleanCast ~x)))}
|
1948
|
+
[x] (if x true false))
|
1949
|
+
|
1950
|
+
(defn number?
|
1951
|
+
"Returns true if x is a Number"
|
1952
|
+
[x]
|
1953
|
+
(instance? Number x))
|
1954
|
+
|
1955
|
+
(defn integer?
|
1956
|
+
"Returns true if n is an integer"
|
1957
|
+
[n]
|
1958
|
+
(or (instance? Integer n)
|
1959
|
+
(instance? Long n)
|
1960
|
+
(instance? BigInteger n)
|
1961
|
+
(instance? Short n)
|
1962
|
+
(instance? Byte n)))
|
1963
|
+
|
1964
|
+
(defn mod
|
1965
|
+
"Modulus of num and div. Truncates toward negative infinity."
|
1966
|
+
[num div]
|
1967
|
+
(let [m (rem num div)]
|
1968
|
+
(if (or (zero? m) (pos? (* num div)))
|
1969
|
+
m
|
1970
|
+
(+ m div))))
|
1971
|
+
|
1972
|
+
(defn ratio?
|
1973
|
+
"Returns true if n is a Ratio"
|
1974
|
+
[n] (instance? clojure.lang.Ratio n))
|
1975
|
+
|
1976
|
+
(defn decimal?
|
1977
|
+
"Returns true if n is a BigDecimal"
|
1978
|
+
[n] (instance? BigDecimal n))
|
1979
|
+
|
1980
|
+
(defn float?
|
1981
|
+
"Returns true if n is a floating point number"
|
1982
|
+
[n]
|
1983
|
+
(or (instance? Double n)
|
1984
|
+
(instance? Float n)))
|
1985
|
+
|
1986
|
+
(defn rational? [n]
|
1987
|
+
"Returns true if n is a rational number"
|
1988
|
+
(or (integer? n) (ratio? n) (decimal? n)))
|
1989
|
+
|
1990
|
+
(defn bigint
|
1991
|
+
"Coerce to BigInteger"
|
1992
|
+
{:tag BigInteger}
|
1993
|
+
[x] (cond
|
1994
|
+
(instance? BigInteger x) x
|
1995
|
+
(decimal? x) (.toBigInteger #^BigDecimal x)
|
1996
|
+
(number? x) (BigInteger/valueOf (long x))
|
1997
|
+
:else (BigInteger. x)))
|
1998
|
+
|
1999
|
+
(defn bigdec
|
2000
|
+
"Coerce to BigDecimal"
|
2001
|
+
{:tag BigDecimal}
|
2002
|
+
[x] (cond
|
2003
|
+
(decimal? x) x
|
2004
|
+
(float? x) (. BigDecimal valueOf (double x))
|
2005
|
+
(ratio? x) (/ (BigDecimal. (.numerator x)) (.denominator x))
|
2006
|
+
(instance? BigInteger x) (BigDecimal. #^BigInteger x)
|
2007
|
+
(number? x) (BigDecimal/valueOf (long x))
|
2008
|
+
:else (BigDecimal. x)))
|
2009
|
+
|
2010
|
+
(def #^{:private true} print-initialized false)
|
2011
|
+
|
2012
|
+
(defmulti print-method (fn [x writer] (type x)))
|
2013
|
+
(defmulti print-dup (fn [x writer] (class x)))
|
2014
|
+
|
2015
|
+
(defn pr-on
|
2016
|
+
{:private true}
|
2017
|
+
[x w]
|
2018
|
+
(if *print-dup*
|
2019
|
+
(print-dup x w)
|
2020
|
+
(print-method x w))
|
2021
|
+
nil)
|
2022
|
+
|
2023
|
+
(defn pr
|
2024
|
+
"Prints the object(s) to the output stream that is the current value
|
2025
|
+
of *out*. Prints the object(s), separated by spaces if there is
|
2026
|
+
more than one. By default, pr and prn print in a way that objects
|
2027
|
+
can be read by the reader"
|
2028
|
+
([] nil)
|
2029
|
+
([x]
|
2030
|
+
(pr-on x *out*))
|
2031
|
+
([x & more]
|
2032
|
+
(pr x)
|
2033
|
+
(. *out* (append \space))
|
2034
|
+
(apply pr more)))
|
2035
|
+
|
2036
|
+
(defn newline
|
2037
|
+
"Writes a newline to the output stream that is the current value of
|
2038
|
+
*out*"
|
2039
|
+
[]
|
2040
|
+
(. *out* (append \newline))
|
2041
|
+
nil)
|
2042
|
+
|
2043
|
+
(defn flush
|
2044
|
+
"Flushes the output stream that is the current value of
|
2045
|
+
*out*"
|
2046
|
+
[]
|
2047
|
+
(. *out* (flush))
|
2048
|
+
nil)
|
2049
|
+
|
2050
|
+
(defn prn
|
2051
|
+
"Same as pr followed by (newline). Observes *flush-on-newline*"
|
2052
|
+
[& more]
|
2053
|
+
(apply pr more)
|
2054
|
+
(newline)
|
2055
|
+
(when *flush-on-newline*
|
2056
|
+
(flush)))
|
2057
|
+
|
2058
|
+
(defn print
|
2059
|
+
"Prints the object(s) to the output stream that is the current value
|
2060
|
+
of *out*. print and println produce output for human consumption."
|
2061
|
+
[& more]
|
2062
|
+
(binding [*print-readably* nil]
|
2063
|
+
(apply pr more)))
|
2064
|
+
|
2065
|
+
(defn println
|
2066
|
+
"Same as print followed by (newline)"
|
2067
|
+
[& more]
|
2068
|
+
(binding [*print-readably* nil]
|
2069
|
+
(apply prn more)))
|
2070
|
+
|
2071
|
+
|
2072
|
+
(defn read
|
2073
|
+
"Reads the next object from stream, which must be an instance of
|
2074
|
+
java.io.PushbackReader or some derivee. stream defaults to the
|
2075
|
+
current value of *in* ."
|
2076
|
+
([]
|
2077
|
+
(read *in*))
|
2078
|
+
([stream]
|
2079
|
+
(read stream true nil))
|
2080
|
+
([stream eof-error? eof-value]
|
2081
|
+
(read stream eof-error? eof-value false))
|
2082
|
+
([stream eof-error? eof-value recursive?]
|
2083
|
+
(. clojure.lang.LispReader (read stream (boolean eof-error?) eof-value recursive?))))
|
2084
|
+
|
2085
|
+
(defn read-line
|
2086
|
+
"Reads the next line from stream that is the current value of *in* ."
|
2087
|
+
[]
|
2088
|
+
(if (instance? clojure.lang.LineNumberingPushbackReader *in*)
|
2089
|
+
(.readLine #^clojure.lang.LineNumberingPushbackReader *in*)
|
2090
|
+
(.readLine #^java.io.BufferedReader *in*)))
|
2091
|
+
|
2092
|
+
(defn read-string
|
2093
|
+
"Reads one object from the string s"
|
2094
|
+
[s] (clojure.lang.RT/readString s))
|
2095
|
+
|
2096
|
+
(defn subvec
|
2097
|
+
"Returns a persistent vector of the items in vector from
|
2098
|
+
start (inclusive) to end (exclusive). If end is not supplied,
|
2099
|
+
defaults to (count vector). This operation is O(1) and very fast, as
|
2100
|
+
the resulting vector shares structure with the original and no
|
2101
|
+
trimming is done."
|
2102
|
+
([v start]
|
2103
|
+
(subvec v start (count v)))
|
2104
|
+
([v start end]
|
2105
|
+
(. clojure.lang.RT (subvec v start end))))
|
2106
|
+
|
2107
|
+
(defmacro with-open
|
2108
|
+
"bindings => [name init ...]
|
2109
|
+
|
2110
|
+
Evaluates body in a try expression with names bound to the values
|
2111
|
+
of the inits, and a finally clause that calls (.close name) on each
|
2112
|
+
name in reverse order."
|
2113
|
+
[bindings & body]
|
2114
|
+
(assert-args with-open
|
2115
|
+
(vector? bindings) "a vector for its binding"
|
2116
|
+
(even? (count bindings)) "an even number of forms in binding vector")
|
2117
|
+
(cond
|
2118
|
+
(= (count bindings) 0) `(do ~@body)
|
2119
|
+
(symbol? (bindings 0)) `(let ~(subvec bindings 0 2)
|
2120
|
+
(try
|
2121
|
+
(with-open ~(subvec bindings 2) ~@body)
|
2122
|
+
(finally
|
2123
|
+
(. ~(bindings 0) close))))
|
2124
|
+
:else (throw (IllegalArgumentException.
|
2125
|
+
"with-open only allows Symbols in bindings"))))
|
2126
|
+
|
2127
|
+
(defmacro doto
|
2128
|
+
"Evaluates x then calls all of the methods and functions with the
|
2129
|
+
value of x supplied at the from of the given arguments. The forms
|
2130
|
+
are evaluated in order. Returns x.
|
2131
|
+
|
2132
|
+
(doto (new java.util.HashMap) (.put \"a\" 1) (.put \"b\" 2))"
|
2133
|
+
[x & forms]
|
2134
|
+
(let [gx (gensym)]
|
2135
|
+
`(let [~gx ~x]
|
2136
|
+
~@(map (fn [f]
|
2137
|
+
(if (seq? f)
|
2138
|
+
`(~(first f) ~gx ~@(next f))
|
2139
|
+
`(~f ~gx)))
|
2140
|
+
forms)
|
2141
|
+
~gx)))
|
2142
|
+
|
2143
|
+
(defmacro memfn
|
2144
|
+
"Expands into code that creates a fn that expects to be passed an
|
2145
|
+
object and any args and calls the named instance method on the
|
2146
|
+
object passing the args. Use when you want to treat a Java method as
|
2147
|
+
a first-class fn."
|
2148
|
+
[name & args]
|
2149
|
+
`(fn [target# ~@args]
|
2150
|
+
(. target# (~name ~@args))))
|
2151
|
+
|
2152
|
+
(defmacro time
|
2153
|
+
"Evaluates expr and prints the time it took. Returns the value of
|
2154
|
+
expr."
|
2155
|
+
[expr]
|
2156
|
+
`(let [start# (. System (nanoTime))
|
2157
|
+
ret# ~expr]
|
2158
|
+
(prn (str "Elapsed time: " (/ (double (- (. System (nanoTime)) start#)) 1000000.0) " msecs"))
|
2159
|
+
ret#))
|
2160
|
+
|
2161
|
+
|
2162
|
+
|
2163
|
+
(import '(java.lang.reflect Array))
|
2164
|
+
|
2165
|
+
(defn alength
|
2166
|
+
"Returns the length of the Java array. Works on arrays of all
|
2167
|
+
types."
|
2168
|
+
{:inline (fn [a] `(. clojure.lang.RT (alength ~a)))}
|
2169
|
+
[array] (. clojure.lang.RT (alength array)))
|
2170
|
+
|
2171
|
+
(defn aclone
|
2172
|
+
"Returns a clone of the Java array. Works on arrays of known
|
2173
|
+
types."
|
2174
|
+
{:inline (fn [a] `(. clojure.lang.RT (aclone ~a)))}
|
2175
|
+
[array] (. clojure.lang.RT (aclone array)))
|
2176
|
+
|
2177
|
+
(defn aget
|
2178
|
+
"Returns the value at the index/indices. Works on Java arrays of all
|
2179
|
+
types."
|
2180
|
+
{:inline (fn [a i] `(. clojure.lang.RT (aget ~a ~i)))
|
2181
|
+
:inline-arities #{2}}
|
2182
|
+
([array idx]
|
2183
|
+
(clojure.lang.Reflector/prepRet (. Array (get array idx))))
|
2184
|
+
([array idx & idxs]
|
2185
|
+
(apply aget (aget array idx) idxs)))
|
2186
|
+
|
2187
|
+
(defn aset
|
2188
|
+
"Sets the value at the index/indices. Works on Java arrays of
|
2189
|
+
reference types. Returns val."
|
2190
|
+
{:inline (fn [a i v] `(. clojure.lang.RT (aset ~a ~i ~v)))
|
2191
|
+
:inline-arities #{3}}
|
2192
|
+
([array idx val]
|
2193
|
+
(. Array (set array idx val))
|
2194
|
+
val)
|
2195
|
+
([array idx idx2 & idxv]
|
2196
|
+
(apply aset (aget array idx) idx2 idxv)))
|
2197
|
+
|
2198
|
+
(defmacro
|
2199
|
+
#^{:private true}
|
2200
|
+
def-aset [name method coerce]
|
2201
|
+
`(defn ~name
|
2202
|
+
{:arglists '([~'array ~'idx ~'val] [~'array ~'idx ~'idx2 & ~'idxv])}
|
2203
|
+
([array# idx# val#]
|
2204
|
+
(. Array (~method array# idx# (~coerce val#)))
|
2205
|
+
val#)
|
2206
|
+
([array# idx# idx2# & idxv#]
|
2207
|
+
(apply ~name (aget array# idx#) idx2# idxv#))))
|
2208
|
+
|
2209
|
+
(def-aset
|
2210
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of int. Returns val."}
|
2211
|
+
aset-int setInt int)
|
2212
|
+
|
2213
|
+
(def-aset
|
2214
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of long. Returns val."}
|
2215
|
+
aset-long setLong long)
|
2216
|
+
|
2217
|
+
(def-aset
|
2218
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of boolean. Returns val."}
|
2219
|
+
aset-boolean setBoolean boolean)
|
2220
|
+
|
2221
|
+
(def-aset
|
2222
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of float. Returns val."}
|
2223
|
+
aset-float setFloat float)
|
2224
|
+
|
2225
|
+
(def-aset
|
2226
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of double. Returns val."}
|
2227
|
+
aset-double setDouble double)
|
2228
|
+
|
2229
|
+
(def-aset
|
2230
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of short. Returns val."}
|
2231
|
+
aset-short setShort short)
|
2232
|
+
|
2233
|
+
(def-aset
|
2234
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of byte. Returns val."}
|
2235
|
+
aset-byte setByte byte)
|
2236
|
+
|
2237
|
+
(def-aset
|
2238
|
+
#^{:doc "Sets the value at the index/indices. Works on arrays of char. Returns val."}
|
2239
|
+
aset-char setChar char)
|
2240
|
+
|
2241
|
+
(defn make-array
|
2242
|
+
"Creates and returns an array of instances of the specified class of
|
2243
|
+
the specified dimension(s). Note that a class object is required.
|
2244
|
+
Class objects can be obtained by using their imported or
|
2245
|
+
fully-qualified name. Class objects for the primitive types can be
|
2246
|
+
obtained using, e.g., Integer/TYPE."
|
2247
|
+
([#^Class type len]
|
2248
|
+
(. Array (newInstance type (int len))))
|
2249
|
+
([#^Class type dim & more-dims]
|
2250
|
+
(let [dims (cons dim more-dims)
|
2251
|
+
#^"[I" dimarray (make-array (. Integer TYPE) (count dims))]
|
2252
|
+
(dotimes [i (alength dimarray)]
|
2253
|
+
(aset-int dimarray i (nth dims i)))
|
2254
|
+
(. Array (newInstance type dimarray)))))
|
2255
|
+
|
2256
|
+
(defn to-array-2d
|
2257
|
+
"Returns a (potentially-ragged) 2-dimensional array of Objects
|
2258
|
+
containing the contents of coll, which can be any Collection of any
|
2259
|
+
Collection."
|
2260
|
+
{:tag "[[Ljava.lang.Object;"}
|
2261
|
+
[#^java.util.Collection coll]
|
2262
|
+
(let [ret (make-array (. Class (forName "[Ljava.lang.Object;")) (. coll (size)))]
|
2263
|
+
(loop [i 0 xs (seq coll)]
|
2264
|
+
(when xs
|
2265
|
+
(aset ret i (to-array (first xs)))
|
2266
|
+
(recur (inc i) (next xs))))
|
2267
|
+
ret))
|
2268
|
+
|
2269
|
+
(defn macroexpand-1
|
2270
|
+
"If form represents a macro form, returns its expansion,
|
2271
|
+
else returns form."
|
2272
|
+
[form]
|
2273
|
+
(. clojure.lang.Compiler (macroexpand1 form)))
|
2274
|
+
|
2275
|
+
(defn macroexpand
|
2276
|
+
"Repeatedly calls macroexpand-1 on form until it no longer
|
2277
|
+
represents a macro form, then returns it. Note neither
|
2278
|
+
macroexpand-1 nor macroexpand expand macros in subforms."
|
2279
|
+
[form]
|
2280
|
+
(let [ex (macroexpand-1 form)]
|
2281
|
+
(if (identical? ex form)
|
2282
|
+
form
|
2283
|
+
(macroexpand ex))))
|
2284
|
+
|
2285
|
+
(defn create-struct
|
2286
|
+
"Returns a structure basis object."
|
2287
|
+
[& keys]
|
2288
|
+
(. clojure.lang.PersistentStructMap (createSlotMap keys)))
|
2289
|
+
|
2290
|
+
(defmacro defstruct
|
2291
|
+
"Same as (def name (create-struct keys...))"
|
2292
|
+
[name & keys]
|
2293
|
+
`(def ~name (create-struct ~@keys)))
|
2294
|
+
|
2295
|
+
(defn struct-map
|
2296
|
+
"Returns a new structmap instance with the keys of the
|
2297
|
+
structure-basis. keyvals may contain all, some or none of the basis
|
2298
|
+
keys - where values are not supplied they will default to nil.
|
2299
|
+
keyvals can also contain keys not in the basis."
|
2300
|
+
[s & inits]
|
2301
|
+
(. clojure.lang.PersistentStructMap (create s inits)))
|
2302
|
+
|
2303
|
+
(defn struct
|
2304
|
+
"Returns a new structmap instance with the keys of the
|
2305
|
+
structure-basis. vals must be supplied for basis keys in order -
|
2306
|
+
where values are not supplied they will default to nil."
|
2307
|
+
[s & vals]
|
2308
|
+
(. clojure.lang.PersistentStructMap (construct s vals)))
|
2309
|
+
|
2310
|
+
(defn accessor
|
2311
|
+
"Returns a fn that, given an instance of a structmap with the basis,
|
2312
|
+
returns the value at the key. The key must be in the basis. The
|
2313
|
+
returned function should be (slightly) more efficient than using
|
2314
|
+
get, but such use of accessors should be limited to known
|
2315
|
+
performance-critical areas."
|
2316
|
+
[s key]
|
2317
|
+
(. clojure.lang.PersistentStructMap (getAccessor s key)))
|
2318
|
+
|
2319
|
+
(defn load-reader
|
2320
|
+
"Sequentially read and evaluate the set of forms contained in the
|
2321
|
+
stream/file"
|
2322
|
+
[rdr] (. clojure.lang.Compiler (load rdr)))
|
2323
|
+
|
2324
|
+
(defn load-string
|
2325
|
+
"Sequentially read and evaluate the set of forms contained in the
|
2326
|
+
string"
|
2327
|
+
[s]
|
2328
|
+
(let [rdr (-> (java.io.StringReader. s)
|
2329
|
+
(clojure.lang.LineNumberingPushbackReader.))]
|
2330
|
+
(load-reader rdr)))
|
2331
|
+
|
2332
|
+
(defn set
|
2333
|
+
"Returns a set of the distinct elements of coll."
|
2334
|
+
[coll] (apply hash-set coll))
|
2335
|
+
|
2336
|
+
(defn #^{:private true}
|
2337
|
+
filter-key [keyfn pred amap]
|
2338
|
+
(loop [ret {} es (seq amap)]
|
2339
|
+
(if es
|
2340
|
+
(if (pred (keyfn (first es)))
|
2341
|
+
(recur (assoc ret (key (first es)) (val (first es))) (next es))
|
2342
|
+
(recur ret (next es)))
|
2343
|
+
ret)))
|
2344
|
+
|
2345
|
+
(defn find-ns
|
2346
|
+
"Returns the namespace named by the symbol or nil if it doesn't exist."
|
2347
|
+
[sym] (clojure.lang.Namespace/find sym))
|
2348
|
+
|
2349
|
+
(defn create-ns
|
2350
|
+
"Create a new namespace named by the symbol if one doesn't already
|
2351
|
+
exist, returns it or the already-existing namespace of the same
|
2352
|
+
name."
|
2353
|
+
[sym] (clojure.lang.Namespace/findOrCreate sym))
|
2354
|
+
|
2355
|
+
(defn remove-ns
|
2356
|
+
"Removes the namespace named by the symbol. Use with caution.
|
2357
|
+
Cannot be used to remove the clojure namespace."
|
2358
|
+
[sym] (clojure.lang.Namespace/remove sym))
|
2359
|
+
|
2360
|
+
(defn all-ns
|
2361
|
+
"Returns a sequence of all namespaces."
|
2362
|
+
[] (clojure.lang.Namespace/all))
|
2363
|
+
|
2364
|
+
(defn #^clojure.lang.Namespace the-ns
|
2365
|
+
"If passed a namespace, returns it. Else, when passed a symbol,
|
2366
|
+
returns the namespace named by it, throwing an exception if not
|
2367
|
+
found."
|
2368
|
+
[x]
|
2369
|
+
(if (instance? clojure.lang.Namespace x)
|
2370
|
+
x
|
2371
|
+
(or (find-ns x) (throw (Exception. (str "No namespace: " x " found"))))))
|
2372
|
+
|
2373
|
+
(defn ns-name
|
2374
|
+
"Returns the name of the namespace, a symbol."
|
2375
|
+
[ns]
|
2376
|
+
(.getName (the-ns ns)))
|
2377
|
+
|
2378
|
+
(defn ns-map
|
2379
|
+
"Returns a map of all the mappings for the namespace."
|
2380
|
+
[ns]
|
2381
|
+
(.getMappings (the-ns ns)))
|
2382
|
+
|
2383
|
+
(defn ns-unmap
|
2384
|
+
"Removes the mappings for the symbol from the namespace."
|
2385
|
+
[ns sym]
|
2386
|
+
(.unmap (the-ns ns) sym))
|
2387
|
+
|
2388
|
+
;(defn export [syms]
|
2389
|
+
; (doseq [sym syms]
|
2390
|
+
; (.. *ns* (intern sym) (setExported true))))
|
2391
|
+
|
2392
|
+
(defn ns-publics
|
2393
|
+
"Returns a map of the public intern mappings for the namespace."
|
2394
|
+
[ns]
|
2395
|
+
(let [ns (the-ns ns)]
|
2396
|
+
(filter-key val (fn [#^clojure.lang.Var v] (and (instance? clojure.lang.Var v)
|
2397
|
+
(= ns (.ns v))
|
2398
|
+
(.isPublic v)))
|
2399
|
+
(ns-map ns))))
|
2400
|
+
|
2401
|
+
(defn ns-imports
|
2402
|
+
"Returns a map of the import mappings for the namespace."
|
2403
|
+
[ns]
|
2404
|
+
(filter-key val (partial instance? Class) (ns-map ns)))
|
2405
|
+
|
2406
|
+
(defn refer
|
2407
|
+
"refers to all public vars of ns, subject to filters.
|
2408
|
+
filters can include at most one each of:
|
2409
|
+
|
2410
|
+
:exclude list-of-symbols
|
2411
|
+
:only list-of-symbols
|
2412
|
+
:rename map-of-fromsymbol-tosymbol
|
2413
|
+
|
2414
|
+
For each public interned var in the namespace named by the symbol,
|
2415
|
+
adds a mapping from the name of the var to the var to the current
|
2416
|
+
namespace. Throws an exception if name is already mapped to
|
2417
|
+
something else in the current namespace. Filters can be used to
|
2418
|
+
select a subset, via inclusion or exclusion, or to provide a mapping
|
2419
|
+
to a symbol different from the var's name, in order to prevent
|
2420
|
+
clashes. Use :use in the ns macro in preference to calling this directly."
|
2421
|
+
[ns-sym & filters]
|
2422
|
+
(let [ns (or (find-ns ns-sym) (throw (new Exception (str "No namespace: " ns-sym))))
|
2423
|
+
fs (apply hash-map filters)
|
2424
|
+
nspublics (ns-publics ns)
|
2425
|
+
rename (or (:rename fs) {})
|
2426
|
+
exclude (set (:exclude fs))
|
2427
|
+
to-do (or (:only fs) (keys nspublics))]
|
2428
|
+
(doseq [sym to-do]
|
2429
|
+
(when-not (exclude sym)
|
2430
|
+
(let [v (nspublics sym)]
|
2431
|
+
(when-not v
|
2432
|
+
(throw (new java.lang.IllegalAccessError (str sym " is not public"))))
|
2433
|
+
(. *ns* (refer (or (rename sym) sym) v)))))))
|
2434
|
+
|
2435
|
+
(defn ns-refers
|
2436
|
+
"Returns a map of the refer mappings for the namespace."
|
2437
|
+
[ns]
|
2438
|
+
(let [ns (the-ns ns)]
|
2439
|
+
(filter-key val (fn [#^clojure.lang.Var v] (and (instance? clojure.lang.Var v)
|
2440
|
+
(not= ns (.ns v))))
|
2441
|
+
(ns-map ns))))
|
2442
|
+
|
2443
|
+
(defn ns-interns
|
2444
|
+
"Returns a map of the intern mappings for the namespace."
|
2445
|
+
[ns]
|
2446
|
+
(let [ns (the-ns ns)]
|
2447
|
+
(filter-key val (fn [#^clojure.lang.Var v] (and (instance? clojure.lang.Var v)
|
2448
|
+
(= ns (.ns v))))
|
2449
|
+
(ns-map ns))))
|
2450
|
+
|
2451
|
+
(defn alias
|
2452
|
+
"Add an alias in the current namespace to another
|
2453
|
+
namespace. Arguments are two symbols: the alias to be used, and
|
2454
|
+
the symbolic name of the target namespace. Use :as in the ns macro in preference
|
2455
|
+
to calling this directly."
|
2456
|
+
[alias namespace-sym]
|
2457
|
+
(.addAlias *ns* alias (find-ns namespace-sym)))
|
2458
|
+
|
2459
|
+
(defn ns-aliases
|
2460
|
+
"Returns a map of the aliases for the namespace."
|
2461
|
+
[ns]
|
2462
|
+
(.getAliases (the-ns ns)))
|
2463
|
+
|
2464
|
+
(defn ns-unalias
|
2465
|
+
"Removes the alias for the symbol from the namespace."
|
2466
|
+
[ns sym]
|
2467
|
+
(.removeAlias (the-ns ns) sym))
|
2468
|
+
|
2469
|
+
(defn take-nth
|
2470
|
+
"Returns a lazy seq of every nth item in coll."
|
2471
|
+
[n coll]
|
2472
|
+
(lazy-seq
|
2473
|
+
(when-let [s (seq coll)]
|
2474
|
+
(cons (first s) (take-nth n (drop n s))))))
|
2475
|
+
|
2476
|
+
(defn interleave
|
2477
|
+
"Returns a lazy seq of the first item in each coll, then the second
|
2478
|
+
etc."
|
2479
|
+
[& colls]
|
2480
|
+
(apply concat (apply map list colls)))
|
2481
|
+
|
2482
|
+
(defn var-get
|
2483
|
+
"Gets the value in the var object"
|
2484
|
+
[#^clojure.lang.Var x] (. x (get)))
|
2485
|
+
|
2486
|
+
(defn var-set
|
2487
|
+
"Sets the value in the var object to val. The var must be
|
2488
|
+
thread-locally bound."
|
2489
|
+
[#^clojure.lang.Var x val] (. x (set val)))
|
2490
|
+
|
2491
|
+
(defmacro with-local-vars
|
2492
|
+
"varbinding=> symbol init-expr
|
2493
|
+
|
2494
|
+
Executes the exprs in a context in which the symbols are bound to
|
2495
|
+
vars with per-thread bindings to the init-exprs. The symbols refer
|
2496
|
+
to the var objects themselves, and must be accessed with var-get and
|
2497
|
+
var-set"
|
2498
|
+
[name-vals-vec & body]
|
2499
|
+
(assert-args with-local-vars
|
2500
|
+
(vector? name-vals-vec) "a vector for its binding"
|
2501
|
+
(even? (count name-vals-vec)) "an even number of forms in binding vector")
|
2502
|
+
`(let [~@(interleave (take-nth 2 name-vals-vec)
|
2503
|
+
(repeat '(. clojure.lang.Var (create))))]
|
2504
|
+
(. clojure.lang.Var (pushThreadBindings (hash-map ~@name-vals-vec)))
|
2505
|
+
(try
|
2506
|
+
~@body
|
2507
|
+
(finally (. clojure.lang.Var (popThreadBindings))))))
|
2508
|
+
|
2509
|
+
(defn ns-resolve
|
2510
|
+
"Returns the var or Class to which a symbol will be resolved in the
|
2511
|
+
namespace, else nil. Note that if the symbol is fully qualified,
|
2512
|
+
the var/Class to which it resolves need not be present in the
|
2513
|
+
namespace."
|
2514
|
+
[ns sym]
|
2515
|
+
(clojure.lang.Compiler/maybeResolveIn (the-ns ns) sym))
|
2516
|
+
|
2517
|
+
(defn resolve
|
2518
|
+
"same as (ns-resolve *ns* symbol)"
|
2519
|
+
[sym] (ns-resolve *ns* sym))
|
2520
|
+
|
2521
|
+
(defn array-map
|
2522
|
+
"Constructs an array-map."
|
2523
|
+
([] (. clojure.lang.PersistentArrayMap EMPTY))
|
2524
|
+
([& keyvals] (new clojure.lang.PersistentArrayMap (to-array keyvals))))
|
2525
|
+
|
2526
|
+
(defn nthnext
|
2527
|
+
"Returns the nth next of coll, (seq coll) when n is 0."
|
2528
|
+
[coll n]
|
2529
|
+
(loop [n n xs (seq coll)]
|
2530
|
+
(if (and xs (pos? n))
|
2531
|
+
(recur (dec n) (next xs))
|
2532
|
+
xs)))
|
2533
|
+
|
2534
|
+
|
2535
|
+
;redefine let and loop with destructuring
|
2536
|
+
(defn destructure [bindings]
|
2537
|
+
(let [bmap (apply array-map bindings)
|
2538
|
+
pb (fn pb [bvec b v]
|
2539
|
+
(let [pvec
|
2540
|
+
(fn [bvec b val]
|
2541
|
+
(let [gvec (gensym "vec__")]
|
2542
|
+
(loop [ret (-> bvec (conj gvec) (conj val))
|
2543
|
+
n 0
|
2544
|
+
bs b
|
2545
|
+
seen-rest? false]
|
2546
|
+
(if (seq bs)
|
2547
|
+
(let [firstb (first bs)]
|
2548
|
+
(cond
|
2549
|
+
(= firstb '&) (recur (pb ret (second bs) (list `nthnext gvec n))
|
2550
|
+
n
|
2551
|
+
(nnext bs)
|
2552
|
+
true)
|
2553
|
+
(= firstb :as) (pb ret (second bs) gvec)
|
2554
|
+
:else (if seen-rest?
|
2555
|
+
(throw (new Exception "Unsupported binding form, only :as can follow & parameter"))
|
2556
|
+
(recur (pb ret firstb (list `nth gvec n nil))
|
2557
|
+
(inc n)
|
2558
|
+
(next bs)
|
2559
|
+
seen-rest?))))
|
2560
|
+
ret))))
|
2561
|
+
pmap
|
2562
|
+
(fn [bvec b v]
|
2563
|
+
(let [gmap (or (:as b) (gensym "map__"))
|
2564
|
+
defaults (:or b)]
|
2565
|
+
(loop [ret (-> bvec (conj gmap) (conj v))
|
2566
|
+
bes (reduce
|
2567
|
+
(fn [bes entry]
|
2568
|
+
(reduce #(assoc %1 %2 ((val entry) %2))
|
2569
|
+
(dissoc bes (key entry))
|
2570
|
+
((key entry) bes)))
|
2571
|
+
(dissoc b :as :or)
|
2572
|
+
{:keys #(keyword (str %)), :strs str, :syms #(list `quote %)})]
|
2573
|
+
(if (seq bes)
|
2574
|
+
(let [bb (key (first bes))
|
2575
|
+
bk (val (first bes))
|
2576
|
+
has-default (contains? defaults bb)]
|
2577
|
+
(recur (pb ret bb (if has-default
|
2578
|
+
(list `get gmap bk (defaults bb))
|
2579
|
+
(list `get gmap bk)))
|
2580
|
+
(next bes)))
|
2581
|
+
ret))))]
|
2582
|
+
(cond
|
2583
|
+
(symbol? b) (-> bvec (conj b) (conj v))
|
2584
|
+
(vector? b) (pvec bvec b v)
|
2585
|
+
(map? b) (pmap bvec b v)
|
2586
|
+
:else (throw (new Exception (str "Unsupported binding form: " b))))))
|
2587
|
+
process-entry (fn [bvec b] (pb bvec (key b) (val b)))]
|
2588
|
+
(if (every? symbol? (keys bmap))
|
2589
|
+
bindings
|
2590
|
+
(reduce process-entry [] bmap))))
|
2591
|
+
|
2592
|
+
(defmacro let
|
2593
|
+
"Evaluates the exprs in a lexical context in which the symbols in
|
2594
|
+
the binding-forms are bound to their respective init-exprs or parts
|
2595
|
+
therein."
|
2596
|
+
[bindings & body]
|
2597
|
+
(assert-args let
|
2598
|
+
(vector? bindings) "a vector for its binding"
|
2599
|
+
(even? (count bindings)) "an even number of forms in binding vector")
|
2600
|
+
`(let* ~(destructure bindings) ~@body))
|
2601
|
+
|
2602
|
+
;redefine fn with destructuring
|
2603
|
+
(defmacro fn
|
2604
|
+
"(fn name? [params* ] exprs*)
|
2605
|
+
(fn name? ([params* ] exprs*)+)
|
2606
|
+
|
2607
|
+
params => positional-params* , or positional-params* & next-param
|
2608
|
+
positional-param => binding-form
|
2609
|
+
next-param => binding-form
|
2610
|
+
name => symbol
|
2611
|
+
|
2612
|
+
Defines a function"
|
2613
|
+
[& sigs]
|
2614
|
+
(let [name (if (symbol? (first sigs)) (first sigs) nil)
|
2615
|
+
sigs (if name (next sigs) sigs)
|
2616
|
+
sigs (if (vector? (first sigs)) (list sigs) sigs)
|
2617
|
+
psig (fn [sig]
|
2618
|
+
(let [[params & body] sig]
|
2619
|
+
(if (every? symbol? params)
|
2620
|
+
sig
|
2621
|
+
(loop [params params
|
2622
|
+
new-params []
|
2623
|
+
lets []]
|
2624
|
+
(if params
|
2625
|
+
(if (symbol? (first params))
|
2626
|
+
(recur (next params) (conj new-params (first params)) lets)
|
2627
|
+
(let [gparam (gensym "p__")]
|
2628
|
+
(recur (next params) (conj new-params gparam)
|
2629
|
+
(-> lets (conj (first params)) (conj gparam)))))
|
2630
|
+
`(~new-params
|
2631
|
+
(let ~lets
|
2632
|
+
~@body)))))))
|
2633
|
+
new-sigs (map psig sigs)]
|
2634
|
+
(with-meta
|
2635
|
+
(if name
|
2636
|
+
(list* 'fn* name new-sigs)
|
2637
|
+
(cons 'fn* new-sigs))
|
2638
|
+
*macro-meta*)))
|
2639
|
+
|
2640
|
+
(defmacro loop
|
2641
|
+
"Evaluates the exprs in a lexical context in which the symbols in
|
2642
|
+
the binding-forms are bound to their respective init-exprs or parts
|
2643
|
+
therein. Acts as a recur target."
|
2644
|
+
[bindings & body]
|
2645
|
+
(assert-args loop
|
2646
|
+
(vector? bindings) "a vector for its binding"
|
2647
|
+
(even? (count bindings)) "an even number of forms in binding vector")
|
2648
|
+
(let [db (destructure bindings)]
|
2649
|
+
(if (= db bindings)
|
2650
|
+
`(loop* ~bindings ~@body)
|
2651
|
+
(let [vs (take-nth 2 (drop 1 bindings))
|
2652
|
+
bs (take-nth 2 bindings)
|
2653
|
+
gs (map (fn [b] (if (symbol? b) b (gensym))) bs)
|
2654
|
+
bfs (reduce (fn [ret [b v g]]
|
2655
|
+
(if (symbol? b)
|
2656
|
+
(conj ret g v)
|
2657
|
+
(conj ret g v b g)))
|
2658
|
+
[] (map vector bs vs gs))]
|
2659
|
+
`(let ~bfs
|
2660
|
+
(loop* ~(vec (interleave gs gs))
|
2661
|
+
(let ~(vec (interleave bs gs))
|
2662
|
+
~@body)))))))
|
2663
|
+
|
2664
|
+
(defmacro when-first
|
2665
|
+
"bindings => x xs
|
2666
|
+
|
2667
|
+
Same as (when (seq xs) (let [x (first xs)] body))"
|
2668
|
+
[bindings & body]
|
2669
|
+
(assert-args when-first
|
2670
|
+
(vector? bindings) "a vector for its binding"
|
2671
|
+
(= 2 (count bindings)) "exactly 2 forms in binding vector")
|
2672
|
+
(let [[x xs] bindings]
|
2673
|
+
`(when (seq ~xs)
|
2674
|
+
(let [~x (first ~xs)]
|
2675
|
+
~@body))))
|
2676
|
+
|
2677
|
+
(defmacro lazy-cat
|
2678
|
+
"Expands to code which yields a lazy sequence of the concatenation
|
2679
|
+
of the supplied colls. Each coll expr is not evaluated until it is
|
2680
|
+
needed.
|
2681
|
+
|
2682
|
+
(lazy-cat xs ys zs) === (concat (lazy-seq xs) (lazy-seq ys) (lazy-seq zs))"
|
2683
|
+
[& colls]
|
2684
|
+
`(concat ~@(map #(list `lazy-seq %) colls)))
|
2685
|
+
|
2686
|
+
(defmacro for
|
2687
|
+
"List comprehension. Takes a vector of one or more
|
2688
|
+
binding-form/collection-expr pairs, each followed by zero or more
|
2689
|
+
modifiers, and yields a lazy sequence of evaluations of expr.
|
2690
|
+
Collections are iterated in a nested fashion, rightmost fastest,
|
2691
|
+
and nested coll-exprs can refer to bindings created in prior
|
2692
|
+
binding-forms. Supported modifiers are: :let [binding-form expr ...],
|
2693
|
+
:while test, :when test.
|
2694
|
+
|
2695
|
+
(take 100 (for [x (range 100000000) y (range 1000000) :while (< y x)] [x y]))"
|
2696
|
+
[seq-exprs body-expr]
|
2697
|
+
(assert-args for
|
2698
|
+
(vector? seq-exprs) "a vector for its binding"
|
2699
|
+
(even? (count seq-exprs)) "an even number of forms in binding vector")
|
2700
|
+
(let [to-groups (fn [seq-exprs]
|
2701
|
+
(reduce (fn [groups [k v]]
|
2702
|
+
(if (keyword? k)
|
2703
|
+
(conj (pop groups) (conj (peek groups) [k v]))
|
2704
|
+
(conj groups [k v])))
|
2705
|
+
[] (partition 2 seq-exprs)))
|
2706
|
+
err (fn [& msg] (throw (IllegalArgumentException. (apply str msg))))
|
2707
|
+
emit-bind (fn emit-bind [[[bind expr & mod-pairs]
|
2708
|
+
& [[_ next-expr] :as next-groups]]]
|
2709
|
+
(let [giter (gensym "iter__")
|
2710
|
+
gxs (gensym "s__")
|
2711
|
+
do-mod (fn do-mod [[[k v :as pair] & etc]]
|
2712
|
+
(cond
|
2713
|
+
(= k :let) `(let ~v ~(do-mod etc))
|
2714
|
+
(= k :while) `(when ~v ~(do-mod etc))
|
2715
|
+
(= k :when) `(if ~v
|
2716
|
+
~(do-mod etc)
|
2717
|
+
(recur (rest ~gxs)))
|
2718
|
+
(keyword? k) (err "Invalid 'for' keyword " k)
|
2719
|
+
next-groups
|
2720
|
+
`(let [iterys# ~(emit-bind next-groups)
|
2721
|
+
fs# (seq (iterys# ~next-expr))]
|
2722
|
+
(if fs#
|
2723
|
+
(concat fs# (~giter (rest ~gxs)))
|
2724
|
+
(recur (rest ~gxs))))
|
2725
|
+
:else `(cons ~body-expr
|
2726
|
+
(~giter (rest ~gxs)))))]
|
2727
|
+
`(fn ~giter [~gxs]
|
2728
|
+
(lazy-seq
|
2729
|
+
(loop [~gxs ~gxs]
|
2730
|
+
(when-first [~bind ~gxs]
|
2731
|
+
~(do-mod mod-pairs)))))))]
|
2732
|
+
`(let [iter# ~(emit-bind (to-groups seq-exprs))]
|
2733
|
+
(iter# ~(second seq-exprs)))))
|
2734
|
+
|
2735
|
+
(defmacro comment
|
2736
|
+
"Ignores body, yields nil"
|
2737
|
+
[& body])
|
2738
|
+
|
2739
|
+
(defmacro with-out-str
|
2740
|
+
"Evaluates exprs in a context in which *out* is bound to a fresh
|
2741
|
+
StringWriter. Returns the string created by any nested printing
|
2742
|
+
calls."
|
2743
|
+
[& body]
|
2744
|
+
`(let [s# (new java.io.StringWriter)]
|
2745
|
+
(binding [*out* s#]
|
2746
|
+
~@body
|
2747
|
+
(str s#))))
|
2748
|
+
|
2749
|
+
(defmacro with-in-str
|
2750
|
+
"Evaluates body in a context in which *in* is bound to a fresh
|
2751
|
+
StringReader initialized with the string s."
|
2752
|
+
[s & body]
|
2753
|
+
`(with-open [s# (-> (java.io.StringReader. ~s) clojure.lang.LineNumberingPushbackReader.)]
|
2754
|
+
(binding [*in* s#]
|
2755
|
+
~@body)))
|
2756
|
+
|
2757
|
+
(defn pr-str
|
2758
|
+
"pr to a string, returning it"
|
2759
|
+
{:tag String}
|
2760
|
+
[& xs]
|
2761
|
+
(with-out-str
|
2762
|
+
(apply pr xs)))
|
2763
|
+
|
2764
|
+
(defn prn-str
|
2765
|
+
"prn to a string, returning it"
|
2766
|
+
{:tag String}
|
2767
|
+
[& xs]
|
2768
|
+
(with-out-str
|
2769
|
+
(apply prn xs)))
|
2770
|
+
|
2771
|
+
(defn print-str
|
2772
|
+
"print to a string, returning it"
|
2773
|
+
{:tag String}
|
2774
|
+
[& xs]
|
2775
|
+
(with-out-str
|
2776
|
+
(apply print xs)))
|
2777
|
+
|
2778
|
+
(defn println-str
|
2779
|
+
"println to a string, returning it"
|
2780
|
+
{:tag String}
|
2781
|
+
[& xs]
|
2782
|
+
(with-out-str
|
2783
|
+
(apply println xs)))
|
2784
|
+
|
2785
|
+
(defmacro assert
|
2786
|
+
"Evaluates expr and throws an exception if it does not evaluate to
|
2787
|
+
logical true."
|
2788
|
+
[x]
|
2789
|
+
`(when-not ~x
|
2790
|
+
(throw (new Exception (str "Assert failed: " (pr-str '~x))))))
|
2791
|
+
|
2792
|
+
(defn test
|
2793
|
+
"test [v] finds fn at key :test in var metadata and calls it,
|
2794
|
+
presuming failure will throw exception"
|
2795
|
+
[v]
|
2796
|
+
(let [f (:test ^v)]
|
2797
|
+
(if f
|
2798
|
+
(do (f) :ok)
|
2799
|
+
:no-test)))
|
2800
|
+
|
2801
|
+
(defn re-pattern
|
2802
|
+
"Returns an instance of java.util.regex.Pattern, for use, e.g. in
|
2803
|
+
re-matcher."
|
2804
|
+
{:tag java.util.regex.Pattern}
|
2805
|
+
[s] (if (instance? java.util.regex.Pattern s)
|
2806
|
+
s
|
2807
|
+
(. java.util.regex.Pattern (compile s))))
|
2808
|
+
|
2809
|
+
(defn re-matcher
|
2810
|
+
"Returns an instance of java.util.regex.Matcher, for use, e.g. in
|
2811
|
+
re-find."
|
2812
|
+
{:tag java.util.regex.Matcher}
|
2813
|
+
[#^java.util.regex.Pattern re s]
|
2814
|
+
(. re (matcher s)))
|
2815
|
+
|
2816
|
+
(defn re-groups
|
2817
|
+
"Returns the groups from the most recent match/find. If there are no
|
2818
|
+
nested groups, returns a string of the entire match. If there are
|
2819
|
+
nested groups, returns a vector of the groups, the first element
|
2820
|
+
being the entire match."
|
2821
|
+
[#^java.util.regex.Matcher m]
|
2822
|
+
(let [gc (. m (groupCount))]
|
2823
|
+
(if (zero? gc)
|
2824
|
+
(. m (group))
|
2825
|
+
(loop [ret [] c 0]
|
2826
|
+
(if (<= c gc)
|
2827
|
+
(recur (conj ret (. m (group c))) (inc c))
|
2828
|
+
ret)))))
|
2829
|
+
|
2830
|
+
(defn re-seq
|
2831
|
+
"Returns a lazy sequence of successive matches of pattern in string,
|
2832
|
+
using java.util.regex.Matcher.find(), each such match processed with
|
2833
|
+
re-groups."
|
2834
|
+
[#^java.util.regex.Pattern re s]
|
2835
|
+
(let [m (re-matcher re s)]
|
2836
|
+
((fn step []
|
2837
|
+
(lazy-seq
|
2838
|
+
(when (. m (find))
|
2839
|
+
(cons (re-groups m) (step))))))))
|
2840
|
+
|
2841
|
+
(defn re-matches
|
2842
|
+
"Returns the match, if any, of string to pattern, using
|
2843
|
+
java.util.regex.Matcher.matches(). Uses re-groups to return the
|
2844
|
+
groups."
|
2845
|
+
[#^java.util.regex.Pattern re s]
|
2846
|
+
(let [m (re-matcher re s)]
|
2847
|
+
(when (. m (matches))
|
2848
|
+
(re-groups m))))
|
2849
|
+
|
2850
|
+
|
2851
|
+
(defn re-find
|
2852
|
+
"Returns the next regex match, if any, of string to pattern, using
|
2853
|
+
java.util.regex.Matcher.find(). Uses re-groups to return the
|
2854
|
+
groups."
|
2855
|
+
([#^java.util.regex.Matcher m]
|
2856
|
+
(when (. m (find))
|
2857
|
+
(re-groups m)))
|
2858
|
+
([#^java.util.regex.Pattern re s]
|
2859
|
+
(let [m (re-matcher re s)]
|
2860
|
+
(re-find m))))
|
2861
|
+
|
2862
|
+
(defn rand
|
2863
|
+
"Returns a random floating point number between 0 (inclusive) and
|
2864
|
+
n (default 1) (exclusive)."
|
2865
|
+
([] (. Math (random)))
|
2866
|
+
([n] (* n (rand))))
|
2867
|
+
|
2868
|
+
(defn rand-int
|
2869
|
+
"Returns a random integer between 0 (inclusive) and n (exclusive)."
|
2870
|
+
[n] (int (rand n)))
|
2871
|
+
|
2872
|
+
(defmacro defn-
|
2873
|
+
"same as defn, yielding non-public def"
|
2874
|
+
[name & decls]
|
2875
|
+
(list* `defn (with-meta name (assoc (meta name) :private true)) decls))
|
2876
|
+
|
2877
|
+
(defn print-doc [v]
|
2878
|
+
(println "-------------------------")
|
2879
|
+
(println (str (ns-name (:ns ^v)) "/" (:name ^v)))
|
2880
|
+
(prn (:arglists ^v))
|
2881
|
+
(when (:macro ^v)
|
2882
|
+
(println "Macro"))
|
2883
|
+
(println " " (:doc ^v)))
|
2884
|
+
|
2885
|
+
(defn find-doc
|
2886
|
+
"Prints documentation for any var whose documentation or name
|
2887
|
+
contains a match for re-string-or-pattern"
|
2888
|
+
[re-string-or-pattern]
|
2889
|
+
(let [re (re-pattern re-string-or-pattern)]
|
2890
|
+
(doseq [ns (all-ns)
|
2891
|
+
v (sort-by (comp :name meta) (vals (ns-interns ns)))
|
2892
|
+
:when (and (:doc ^v)
|
2893
|
+
(or (re-find (re-matcher re (:doc ^v)))
|
2894
|
+
(re-find (re-matcher re (str (:name ^v))))))]
|
2895
|
+
(print-doc v))))
|
2896
|
+
|
2897
|
+
(defn special-form-anchor
|
2898
|
+
"Returns the anchor tag on http://clojure.org/special_forms for the
|
2899
|
+
special form x, or nil"
|
2900
|
+
[x]
|
2901
|
+
(#{'. 'def 'do 'fn 'if 'let 'loop 'monitor-enter 'monitor-exit 'new
|
2902
|
+
'quote 'recur 'set! 'throw 'try 'var} x))
|
2903
|
+
|
2904
|
+
(defn syntax-symbol-anchor
|
2905
|
+
"Returns the anchor tag on http://clojure.org/special_forms for the
|
2906
|
+
special form that uses syntax symbol x, or nil"
|
2907
|
+
[x]
|
2908
|
+
({'& 'fn 'catch 'try 'finally 'try} x))
|
2909
|
+
|
2910
|
+
(defn print-special-doc
|
2911
|
+
[name type anchor]
|
2912
|
+
(println "-------------------------")
|
2913
|
+
(println name)
|
2914
|
+
(println type)
|
2915
|
+
(println (str " Please see http://clojure.org/special_forms#" anchor)))
|
2916
|
+
|
2917
|
+
(defn print-namespace-doc
|
2918
|
+
"Print the documentation string of a Namespace."
|
2919
|
+
[nspace]
|
2920
|
+
(println "-------------------------")
|
2921
|
+
(println (str (ns-name nspace)))
|
2922
|
+
(println " " (:doc ^nspace)))
|
2923
|
+
|
2924
|
+
(defmacro doc
|
2925
|
+
"Prints documentation for a var or special form given its name"
|
2926
|
+
[name]
|
2927
|
+
(cond
|
2928
|
+
(special-form-anchor `~name)
|
2929
|
+
`(print-special-doc '~name "Special Form" (special-form-anchor '~name))
|
2930
|
+
(syntax-symbol-anchor `~name)
|
2931
|
+
`(print-special-doc '~name "Syntax Symbol" (syntax-symbol-anchor '~name))
|
2932
|
+
:else
|
2933
|
+
(let [nspace (find-ns name)]
|
2934
|
+
(if nspace
|
2935
|
+
`(print-namespace-doc ~nspace)
|
2936
|
+
`(print-doc (var ~name))))))
|
2937
|
+
|
2938
|
+
(defn tree-seq
|
2939
|
+
"Returns a lazy sequence of the nodes in a tree, via a depth-first walk.
|
2940
|
+
branch? must be a fn of one arg that returns true if passed a node
|
2941
|
+
that can have children (but may not). children must be a fn of one
|
2942
|
+
arg that returns a sequence of the children. Will only be called on
|
2943
|
+
nodes for which branch? returns true. Root is the root node of the
|
2944
|
+
tree."
|
2945
|
+
[branch? children root]
|
2946
|
+
(let [walk (fn walk [node]
|
2947
|
+
(lazy-seq
|
2948
|
+
(cons node
|
2949
|
+
(when (branch? node)
|
2950
|
+
(mapcat walk (children node))))))]
|
2951
|
+
(walk root)))
|
2952
|
+
|
2953
|
+
(defn file-seq
|
2954
|
+
"A tree seq on java.io.Files"
|
2955
|
+
[dir]
|
2956
|
+
(tree-seq
|
2957
|
+
(fn [#^java.io.File f] (. f (isDirectory)))
|
2958
|
+
(fn [#^java.io.File d] (seq (. d (listFiles))))
|
2959
|
+
dir))
|
2960
|
+
|
2961
|
+
(defn xml-seq
|
2962
|
+
"A tree seq on the xml elements as per xml/parse"
|
2963
|
+
[root]
|
2964
|
+
(tree-seq
|
2965
|
+
(complement string?)
|
2966
|
+
(comp seq :content)
|
2967
|
+
root))
|
2968
|
+
|
2969
|
+
(defn special-symbol?
|
2970
|
+
"Returns true if s names a special form"
|
2971
|
+
[s]
|
2972
|
+
(contains? (. clojure.lang.Compiler specials) s))
|
2973
|
+
|
2974
|
+
(defn var?
|
2975
|
+
"Returns true if v is of type clojure.lang.Var"
|
2976
|
+
[v] (instance? clojure.lang.Var v))
|
2977
|
+
|
2978
|
+
(defn slurp
|
2979
|
+
"Reads the file named by f into a string and returns it."
|
2980
|
+
[#^String f]
|
2981
|
+
(with-open [r (new java.io.BufferedReader (new java.io.FileReader f))]
|
2982
|
+
(let [sb (new StringBuilder)]
|
2983
|
+
(loop [c (. r (read))]
|
2984
|
+
(if (neg? c)
|
2985
|
+
(str sb)
|
2986
|
+
(do
|
2987
|
+
(. sb (append (char c)))
|
2988
|
+
(recur (. r (read)))))))))
|
2989
|
+
|
2990
|
+
(defn subs
|
2991
|
+
"Returns the substring of s beginning at start inclusive, and ending
|
2992
|
+
at end (defaults to length of string), exclusive."
|
2993
|
+
([#^String s start] (. s (substring start)))
|
2994
|
+
([#^String s start end] (. s (substring start end))))
|
2995
|
+
|
2996
|
+
(defn max-key
|
2997
|
+
"Returns the x for which (k x), a number, is greatest."
|
2998
|
+
([k x] x)
|
2999
|
+
([k x y] (if (> (k x) (k y)) x y))
|
3000
|
+
([k x y & more]
|
3001
|
+
(reduce #(max-key k %1 %2) (max-key k x y) more)))
|
3002
|
+
|
3003
|
+
(defn min-key
|
3004
|
+
"Returns the x for which (k x), a number, is least."
|
3005
|
+
([k x] x)
|
3006
|
+
([k x y] (if (< (k x) (k y)) x y))
|
3007
|
+
([k x y & more]
|
3008
|
+
(reduce #(min-key k %1 %2) (min-key k x y) more)))
|
3009
|
+
|
3010
|
+
(defn distinct
|
3011
|
+
"Returns a lazy sequence of the elements of coll with duplicates removed"
|
3012
|
+
[coll]
|
3013
|
+
(let [step (fn step [xs seen]
|
3014
|
+
(lazy-seq
|
3015
|
+
((fn [[f :as xs] seen]
|
3016
|
+
(when-let [s (seq xs)]
|
3017
|
+
(if (contains? seen f)
|
3018
|
+
(recur (rest s) seen)
|
3019
|
+
(cons f (step (rest s) (conj seen f))))))
|
3020
|
+
xs seen)))]
|
3021
|
+
(step coll #{})))
|
3022
|
+
|
3023
|
+
|
3024
|
+
|
3025
|
+
(defn replace
|
3026
|
+
"Given a map of replacement pairs and a vector/collection, returns a
|
3027
|
+
vector/seq with any elements = a key in smap replaced with the
|
3028
|
+
corresponding val in smap"
|
3029
|
+
[smap coll]
|
3030
|
+
(if (vector? coll)
|
3031
|
+
(reduce (fn [v i]
|
3032
|
+
(if-let [e (find smap (nth v i))]
|
3033
|
+
(assoc v i (val e))
|
3034
|
+
v))
|
3035
|
+
coll (range (count coll)))
|
3036
|
+
(map #(if-let [e (find smap %)] (val e) %) coll)))
|
3037
|
+
|
3038
|
+
(defmacro dosync
|
3039
|
+
"Runs the exprs (in an implicit do) in a transaction that encompasses
|
3040
|
+
exprs and any nested calls. Starts a transaction if none is already
|
3041
|
+
running on this thread. Any uncaught exception will abort the
|
3042
|
+
transaction and flow out of dosync. The exprs may be run more than
|
3043
|
+
once, but any effects on Refs will be atomic."
|
3044
|
+
[& exprs]
|
3045
|
+
`(sync nil ~@exprs))
|
3046
|
+
|
3047
|
+
(defmacro with-precision
|
3048
|
+
"Sets the precision and rounding mode to be used for BigDecimal operations.
|
3049
|
+
|
3050
|
+
Usage: (with-precision 10 (/ 1M 3))
|
3051
|
+
or: (with-precision 10 :rounding HALF_DOWN (/ 1M 3))
|
3052
|
+
|
3053
|
+
The rounding mode is one of CEILING, FLOOR, HALF_UP, HALF_DOWN,
|
3054
|
+
HALF_EVEN, UP, DOWN and UNNECESSARY; it defaults to HALF_UP."
|
3055
|
+
[precision & exprs]
|
3056
|
+
(let [[body rm] (if (= (first exprs) :rounding)
|
3057
|
+
[(next (next exprs))
|
3058
|
+
`((. java.math.RoundingMode ~(second exprs)))]
|
3059
|
+
[exprs nil])]
|
3060
|
+
`(binding [*math-context* (java.math.MathContext. ~precision ~@rm)]
|
3061
|
+
~@body)))
|
3062
|
+
|
3063
|
+
(defn bound-fn
|
3064
|
+
{:private true}
|
3065
|
+
[#^clojure.lang.Sorted sc test key]
|
3066
|
+
(fn [e]
|
3067
|
+
(test (.. sc comparator (compare (. sc entryKey e) key)) 0)))
|
3068
|
+
|
3069
|
+
(defn subseq
|
3070
|
+
"sc must be a sorted collection, test(s) one of <, <=, > or
|
3071
|
+
>=. Returns a seq of those entries with keys ek for
|
3072
|
+
which (test (.. sc comparator (compare ek key)) 0) is true"
|
3073
|
+
([#^clojure.lang.Sorted sc test key]
|
3074
|
+
(let [include (bound-fn sc test key)]
|
3075
|
+
(if (#{> >=} test)
|
3076
|
+
(when-let [[e :as s] (. sc seqFrom key true)]
|
3077
|
+
(if (include e) s (next s)))
|
3078
|
+
(take-while include (. sc seq true)))))
|
3079
|
+
([#^clojure.lang.Sorted sc start-test start-key end-test end-key]
|
3080
|
+
(when-let [[e :as s] (. sc seqFrom start-key true)]
|
3081
|
+
(take-while (bound-fn sc end-test end-key)
|
3082
|
+
(if ((bound-fn sc start-test start-key) e) s (next s))))))
|
3083
|
+
|
3084
|
+
(defn rsubseq
|
3085
|
+
"sc must be a sorted collection, test(s) one of <, <=, > or
|
3086
|
+
>=. Returns a reverse seq of those entries with keys ek for
|
3087
|
+
which (test (.. sc comparator (compare ek key)) 0) is true"
|
3088
|
+
([#^clojure.lang.Sorted sc test key]
|
3089
|
+
(let [include (bound-fn sc test key)]
|
3090
|
+
(if (#{< <=} test)
|
3091
|
+
(when-let [[e :as s] (. sc seqFrom key false)]
|
3092
|
+
(if (include e) s (next s)))
|
3093
|
+
(take-while include (. sc seq false)))))
|
3094
|
+
([#^clojure.lang.Sorted sc start-test start-key end-test end-key]
|
3095
|
+
(when-let [[e :as s] (. sc seqFrom end-key false)]
|
3096
|
+
(take-while (bound-fn sc start-test start-key)
|
3097
|
+
(if ((bound-fn sc end-test end-key) e) s (next s))))))
|
3098
|
+
|
3099
|
+
(defn repeatedly
|
3100
|
+
"Takes a function of no args, presumably with side effects, and returns an infinite
|
3101
|
+
lazy sequence of calls to it"
|
3102
|
+
[f] (lazy-seq (cons (f) (repeatedly f))))
|
3103
|
+
|
3104
|
+
(defn add-classpath
|
3105
|
+
"Adds the url (String or URL object) to the classpath per URLClassLoader.addURL"
|
3106
|
+
[url] (. clojure.lang.RT addURL url))
|
3107
|
+
|
3108
|
+
|
3109
|
+
|
3110
|
+
(defn hash
|
3111
|
+
"Returns the hash code of its argument"
|
3112
|
+
[x] (. clojure.lang.Util (hash x)))
|
3113
|
+
|
3114
|
+
(defn interpose
|
3115
|
+
"Returns a lazy seq of the elements of coll separated by sep"
|
3116
|
+
[sep coll] (drop 1 (interleave (repeat sep) coll)))
|
3117
|
+
|
3118
|
+
(defmacro definline
|
3119
|
+
"Experimental - like defmacro, except defines a named function whose
|
3120
|
+
body is the expansion, calls to which may be expanded inline as if
|
3121
|
+
it were a macro. Cannot be used with variadic (&) args."
|
3122
|
+
[name & decl]
|
3123
|
+
(let [[pre-args [args expr]] (split-with (comp not vector?) decl)]
|
3124
|
+
`(do
|
3125
|
+
(defn ~name ~@pre-args ~args ~(apply (eval (list `fn args expr)) args))
|
3126
|
+
(alter-meta! (var ~name) assoc :inline (fn ~args ~expr))
|
3127
|
+
(var ~name))))
|
3128
|
+
|
3129
|
+
(defn empty
|
3130
|
+
"Returns an empty collection of the same category as coll, or nil"
|
3131
|
+
[coll]
|
3132
|
+
(when (instance? clojure.lang.IPersistentCollection coll)
|
3133
|
+
(.empty #^clojure.lang.IPersistentCollection coll)))
|
3134
|
+
|
3135
|
+
(defmacro amap
|
3136
|
+
"Maps an expression across an array a, using an index named idx, and
|
3137
|
+
return value named ret, initialized to a clone of a, then setting each element of
|
3138
|
+
ret to the evaluation of expr, returning the new array ret."
|
3139
|
+
[a idx ret expr]
|
3140
|
+
`(let [a# ~a
|
3141
|
+
~ret (aclone a#)]
|
3142
|
+
(loop [~idx (int 0)]
|
3143
|
+
(if (< ~idx (alength a#))
|
3144
|
+
(do
|
3145
|
+
(aset ~ret ~idx ~expr)
|
3146
|
+
(recur (unchecked-inc ~idx)))
|
3147
|
+
~ret))))
|
3148
|
+
|
3149
|
+
(defmacro areduce
|
3150
|
+
"Reduces an expression across an array a, using an index named idx,
|
3151
|
+
and return value named ret, initialized to init, setting ret to the evaluation of expr at
|
3152
|
+
each step, returning ret."
|
3153
|
+
[a idx ret init expr]
|
3154
|
+
`(let [a# ~a]
|
3155
|
+
(loop [~idx (int 0) ~ret ~init]
|
3156
|
+
(if (< ~idx (alength a#))
|
3157
|
+
(recur (unchecked-inc ~idx) ~expr)
|
3158
|
+
~ret))))
|
3159
|
+
|
3160
|
+
(defn float-array
|
3161
|
+
"Creates an array of floats"
|
3162
|
+
{:inline (fn [& args] `(. clojure.lang.Numbers float_array ~@args))
|
3163
|
+
:inline-arities #{1 2}}
|
3164
|
+
([size-or-seq] (. clojure.lang.Numbers float_array size-or-seq))
|
3165
|
+
([size init-val-or-seq] (. clojure.lang.Numbers float_array size init-val-or-seq)))
|
3166
|
+
|
3167
|
+
(defn double-array
|
3168
|
+
"Creates an array of doubles"
|
3169
|
+
{:inline (fn [& args] `(. clojure.lang.Numbers double_array ~@args))
|
3170
|
+
:inline-arities #{1 2}}
|
3171
|
+
([size-or-seq] (. clojure.lang.Numbers double_array size-or-seq))
|
3172
|
+
([size init-val-or-seq] (. clojure.lang.Numbers double_array size init-val-or-seq)))
|
3173
|
+
|
3174
|
+
(defn int-array
|
3175
|
+
"Creates an array of ints"
|
3176
|
+
{:inline (fn [& args] `(. clojure.lang.Numbers int_array ~@args))
|
3177
|
+
:inline-arities #{1 2}}
|
3178
|
+
([size-or-seq] (. clojure.lang.Numbers int_array size-or-seq))
|
3179
|
+
([size init-val-or-seq] (. clojure.lang.Numbers int_array size init-val-or-seq)))
|
3180
|
+
|
3181
|
+
(defn long-array
|
3182
|
+
"Creates an array of ints"
|
3183
|
+
{:inline (fn [& args] `(. clojure.lang.Numbers long_array ~@args))
|
3184
|
+
:inline-arities #{1 2}}
|
3185
|
+
([size-or-seq] (. clojure.lang.Numbers long_array size-or-seq))
|
3186
|
+
([size init-val-or-seq] (. clojure.lang.Numbers long_array size init-val-or-seq)))
|
3187
|
+
|
3188
|
+
(definline floats
|
3189
|
+
"Casts to float[]"
|
3190
|
+
[xs] `(. clojure.lang.Numbers floats ~xs))
|
3191
|
+
|
3192
|
+
(definline ints
|
3193
|
+
"Casts to int[]"
|
3194
|
+
[xs] `(. clojure.lang.Numbers ints ~xs))
|
3195
|
+
|
3196
|
+
(definline doubles
|
3197
|
+
"Casts to double[]"
|
3198
|
+
[xs] `(. clojure.lang.Numbers doubles ~xs))
|
3199
|
+
|
3200
|
+
(definline longs
|
3201
|
+
"Casts to long[]"
|
3202
|
+
[xs] `(. clojure.lang.Numbers longs ~xs))
|
3203
|
+
|
3204
|
+
(import '(java.util.concurrent BlockingQueue LinkedBlockingQueue))
|
3205
|
+
|
3206
|
+
(defn seque
|
3207
|
+
"Creates a queued seq on another (presumably lazy) seq s. The queued
|
3208
|
+
seq will produce a concrete seq in the background, and can get up to
|
3209
|
+
n items ahead of the consumer. n-or-q can be an integer n buffer
|
3210
|
+
size, or an instance of java.util.concurrent BlockingQueue. Note
|
3211
|
+
that reading from a seque can block if the reader gets ahead of the
|
3212
|
+
producer."
|
3213
|
+
([s] (seque 100 s))
|
3214
|
+
([n-or-q s]
|
3215
|
+
(let [#^BlockingQueue q (if (instance? BlockingQueue n-or-q)
|
3216
|
+
n-or-q
|
3217
|
+
(LinkedBlockingQueue. (int n-or-q)))
|
3218
|
+
NIL (Object.) ;nil sentinel since LBQ doesn't support nils
|
3219
|
+
agt (agent (seq s))
|
3220
|
+
fill (fn [s]
|
3221
|
+
(try
|
3222
|
+
(loop [[x & xs :as s] s]
|
3223
|
+
(if s
|
3224
|
+
(if (.offer q (if (nil? x) NIL x))
|
3225
|
+
(recur xs)
|
3226
|
+
s)
|
3227
|
+
(.put q q))) ; q itself is eos sentinel
|
3228
|
+
(catch Exception e
|
3229
|
+
(.put q q)
|
3230
|
+
(throw e))))
|
3231
|
+
drain (fn drain []
|
3232
|
+
(lazy-seq
|
3233
|
+
(let [x (.take q)]
|
3234
|
+
(if (identical? x q) ;q itself is eos sentinel
|
3235
|
+
(do @agt nil) ;touch agent just to propagate errors
|
3236
|
+
(do
|
3237
|
+
(send-off agt fill)
|
3238
|
+
(cons (if (identical? x NIL) nil x) (drain)))))))]
|
3239
|
+
(send-off agt fill)
|
3240
|
+
(drain))))
|
3241
|
+
|
3242
|
+
(defn class?
|
3243
|
+
"Returns true if x is an instance of Class"
|
3244
|
+
[x] (instance? Class x))
|
3245
|
+
|
3246
|
+
(defn alter-var-root
|
3247
|
+
"Atomically alters the root binding of var v by applying f to its
|
3248
|
+
current value plus any args"
|
3249
|
+
[#^clojure.lang.Var v f & args] (.alterRoot v f args))
|
3250
|
+
|
3251
|
+
(defn make-hierarchy
|
3252
|
+
"Creates a hierarchy object for use with derive, isa? etc."
|
3253
|
+
[] {:parents {} :descendants {} :ancestors {}})
|
3254
|
+
|
3255
|
+
(def #^{:private true}
|
3256
|
+
global-hierarchy (make-hierarchy))
|
3257
|
+
|
3258
|
+
(defn not-empty
|
3259
|
+
"If coll is empty, returns nil, else coll"
|
3260
|
+
[coll] (when (seq coll) coll))
|
3261
|
+
|
3262
|
+
(defn bases
|
3263
|
+
"Returns the immediate superclass and direct interfaces of c, if any"
|
3264
|
+
[#^Class c]
|
3265
|
+
(let [i (.getInterfaces c)
|
3266
|
+
s (.getSuperclass c)]
|
3267
|
+
(not-empty
|
3268
|
+
(if s (cons s i) i))))
|
3269
|
+
|
3270
|
+
(defn supers
|
3271
|
+
"Returns the immediate and indirect superclasses and interfaces of c, if any"
|
3272
|
+
[#^Class class]
|
3273
|
+
(loop [ret (set (bases class)) cs ret]
|
3274
|
+
(if (seq cs)
|
3275
|
+
(let [c (first cs) bs (bases c)]
|
3276
|
+
(recur (into ret bs) (into (disj cs c) bs)))
|
3277
|
+
(not-empty ret))))
|
3278
|
+
|
3279
|
+
(defn isa?
|
3280
|
+
"Returns true if (= child parent), or child is directly or indirectly derived from
|
3281
|
+
parent, either via a Java type inheritance relationship or a
|
3282
|
+
relationship established via derive. h must be a hierarchy obtained
|
3283
|
+
from make-hierarchy, if not supplied defaults to the global
|
3284
|
+
hierarchy"
|
3285
|
+
([child parent] (isa? global-hierarchy child parent))
|
3286
|
+
([h child parent]
|
3287
|
+
(or (= child parent)
|
3288
|
+
(and (class? parent) (class? child)
|
3289
|
+
(. #^Class parent isAssignableFrom child))
|
3290
|
+
(contains? ((:ancestors h) child) parent)
|
3291
|
+
(and (class? child) (some #(contains? ((:ancestors h) %) parent) (supers child)))
|
3292
|
+
(and (vector? parent) (vector? child)
|
3293
|
+
(= (count parent) (count child))
|
3294
|
+
(loop [ret true i 0]
|
3295
|
+
(if (or (not ret) (= i (count parent)))
|
3296
|
+
ret
|
3297
|
+
(recur (isa? h (child i) (parent i)) (inc i))))))))
|
3298
|
+
|
3299
|
+
(defn parents
|
3300
|
+
"Returns the immediate parents of tag, either via a Java type
|
3301
|
+
inheritance relationship or a relationship established via derive. h
|
3302
|
+
must be a hierarchy obtained from make-hierarchy, if not supplied
|
3303
|
+
defaults to the global hierarchy"
|
3304
|
+
([tag] (parents global-hierarchy tag))
|
3305
|
+
([h tag] (not-empty
|
3306
|
+
(let [tp (get (:parents h) tag)]
|
3307
|
+
(if (class? tag)
|
3308
|
+
(into (set (bases tag)) tp)
|
3309
|
+
tp)))))
|
3310
|
+
|
3311
|
+
(defn ancestors
|
3312
|
+
"Returns the immediate and indirect parents of tag, either via a Java type
|
3313
|
+
inheritance relationship or a relationship established via derive. h
|
3314
|
+
must be a hierarchy obtained from make-hierarchy, if not supplied
|
3315
|
+
defaults to the global hierarchy"
|
3316
|
+
([tag] (ancestors global-hierarchy tag))
|
3317
|
+
([h tag] (not-empty
|
3318
|
+
(let [ta (get (:ancestors h) tag)]
|
3319
|
+
(if (class? tag)
|
3320
|
+
(let [superclasses (set (supers tag))]
|
3321
|
+
(reduce into superclasses
|
3322
|
+
(cons ta
|
3323
|
+
(map #(get (:ancestors h) %) superclasses))))
|
3324
|
+
ta)))))
|
3325
|
+
|
3326
|
+
(defn descendants
|
3327
|
+
"Returns the immediate and indirect children of tag, through a
|
3328
|
+
relationship established via derive. h must be a hierarchy obtained
|
3329
|
+
from make-hierarchy, if not supplied defaults to the global
|
3330
|
+
hierarchy. Note: does not work on Java type inheritance
|
3331
|
+
relationships."
|
3332
|
+
([tag] (descendants global-hierarchy tag))
|
3333
|
+
([h tag] (if (class? tag)
|
3334
|
+
(throw (java.lang.UnsupportedOperationException. "Can't get descendants of classes"))
|
3335
|
+
(not-empty (get (:descendants h) tag)))))
|
3336
|
+
|
3337
|
+
(defn derive
|
3338
|
+
"Establishes a parent/child relationship between parent and
|
3339
|
+
tag. Parent must be a namespace-qualified symbol or keyword and
|
3340
|
+
child can be either a namespace-qualified symbol or keyword or a
|
3341
|
+
class. h must be a hierarchy obtained from make-hierarchy, if not
|
3342
|
+
supplied defaults to, and modifies, the global hierarchy."
|
3343
|
+
([tag parent]
|
3344
|
+
(assert (namespace parent))
|
3345
|
+
(assert (or (class? tag) (and (instance? clojure.lang.Named tag) (namespace tag))))
|
3346
|
+
|
3347
|
+
(alter-var-root #'global-hierarchy derive tag parent) nil)
|
3348
|
+
([h tag parent]
|
3349
|
+
(assert (not= tag parent))
|
3350
|
+
(assert (or (class? tag) (instance? clojure.lang.Named tag)))
|
3351
|
+
(assert (instance? clojure.lang.Named parent))
|
3352
|
+
|
3353
|
+
(let [tp (:parents h)
|
3354
|
+
td (:descendants h)
|
3355
|
+
ta (:ancestors h)
|
3356
|
+
tf (fn [m source sources target targets]
|
3357
|
+
(reduce (fn [ret k]
|
3358
|
+
(assoc ret k
|
3359
|
+
(reduce conj (get targets k #{}) (cons target (targets target)))))
|
3360
|
+
m (cons source (sources source))))]
|
3361
|
+
(or
|
3362
|
+
(when-not (contains? (tp tag) parent)
|
3363
|
+
(when (contains? (ta tag) parent)
|
3364
|
+
(throw (Exception. (print-str tag "already has" parent "as ancestor"))))
|
3365
|
+
(when (contains? (ta parent) tag)
|
3366
|
+
(throw (Exception. (print-str "Cyclic derivation:" parent "has" tag "as ancestor"))))
|
3367
|
+
{:parents (assoc (:parents h) tag (conj (get tp tag #{}) parent))
|
3368
|
+
:ancestors (tf (:ancestors h) tag td parent ta)
|
3369
|
+
:descendants (tf (:descendants h) parent ta tag td)})
|
3370
|
+
h))))
|
3371
|
+
|
3372
|
+
(defn underive
|
3373
|
+
"Removes a parent/child relationship between parent and
|
3374
|
+
tag. h must be a hierarchy obtained from make-hierarchy, if not
|
3375
|
+
supplied defaults to, and modifies, the global hierarchy."
|
3376
|
+
([tag parent] (alter-var-root #'global-hierarchy underive tag parent) nil)
|
3377
|
+
([h tag parent]
|
3378
|
+
(let [tp (:parents h)
|
3379
|
+
td (:descendants h)
|
3380
|
+
ta (:ancestors h)
|
3381
|
+
tf (fn [m source sources target targets]
|
3382
|
+
(reduce
|
3383
|
+
(fn [ret k]
|
3384
|
+
(assoc ret k
|
3385
|
+
(reduce disj (get targets k) (cons target (targets target)))))
|
3386
|
+
m (cons source (sources source))))]
|
3387
|
+
(if (contains? (tp tag) parent)
|
3388
|
+
{:parent (assoc (:parents h) tag (disj (get tp tag) parent))
|
3389
|
+
:ancestors (tf (:ancestors h) tag td parent ta)
|
3390
|
+
:descendants (tf (:descendants h) parent ta tag td)}
|
3391
|
+
h))))
|
3392
|
+
|
3393
|
+
|
3394
|
+
(defn distinct?
|
3395
|
+
"Returns true if no two of the arguments are ="
|
3396
|
+
{:tag Boolean}
|
3397
|
+
([x] true)
|
3398
|
+
([x y] (not (= x y)))
|
3399
|
+
([x y & more]
|
3400
|
+
(if (not= x y)
|
3401
|
+
(loop [s #{x y} [x & etc :as xs] more]
|
3402
|
+
(if xs
|
3403
|
+
(if (contains? s x)
|
3404
|
+
false
|
3405
|
+
(recur (conj s x) etc))
|
3406
|
+
true))
|
3407
|
+
false)))
|
3408
|
+
|
3409
|
+
(defn resultset-seq
|
3410
|
+
"Creates and returns a lazy sequence of structmaps corresponding to
|
3411
|
+
the rows in the java.sql.ResultSet rs"
|
3412
|
+
[#^java.sql.ResultSet rs]
|
3413
|
+
(let [rsmeta (. rs (getMetaData))
|
3414
|
+
idxs (range 1 (inc (. rsmeta (getColumnCount))))
|
3415
|
+
keys (map (comp keyword #(.toLowerCase #^String %))
|
3416
|
+
(map (fn [i] (. rsmeta (getColumnLabel i))) idxs))
|
3417
|
+
check-keys
|
3418
|
+
(or (apply distinct? keys)
|
3419
|
+
(throw (Exception. "ResultSet must have unique column labels")))
|
3420
|
+
row-struct (apply create-struct keys)
|
3421
|
+
row-values (fn [] (map (fn [#^Integer i] (. rs (getObject i))) idxs))
|
3422
|
+
rows (fn thisfn []
|
3423
|
+
(lazy-seq
|
3424
|
+
(when (. rs (next))
|
3425
|
+
(cons (apply struct row-struct (row-values)) (thisfn)))))]
|
3426
|
+
(rows)))
|
3427
|
+
|
3428
|
+
(defn iterator-seq
|
3429
|
+
"Returns a seq on a java.util.Iterator. Note that most collections
|
3430
|
+
providing iterators implement Iterable and thus support seq directly."
|
3431
|
+
[iter]
|
3432
|
+
(clojure.lang.IteratorSeq/create iter))
|
3433
|
+
|
3434
|
+
(defn enumeration-seq
|
3435
|
+
"Returns a seq on a java.util.Enumeration"
|
3436
|
+
[e]
|
3437
|
+
(clojure.lang.EnumerationSeq/create e))
|
3438
|
+
|
3439
|
+
(defn format
|
3440
|
+
"Formats a string using java.lang.String.format, see java.util.Formatter for format
|
3441
|
+
string syntax"
|
3442
|
+
{:tag String}
|
3443
|
+
[fmt & args]
|
3444
|
+
(String/format fmt (to-array args)))
|
3445
|
+
|
3446
|
+
(defn printf
|
3447
|
+
"Prints formatted output, as per format"
|
3448
|
+
[fmt & args]
|
3449
|
+
(print (apply format fmt args)))
|
3450
|
+
|
3451
|
+
(def gen-class)
|
3452
|
+
|
3453
|
+
(defmacro ns
|
3454
|
+
"Sets *ns* to the namespace named by name (unevaluated), creating it
|
3455
|
+
if needed. references can be zero or more of: (:refer-clojure ...)
|
3456
|
+
(:require ...) (:use ...) (:import ...) (:load ...) (:gen-class)
|
3457
|
+
with the syntax of refer-clojure/require/use/import/load/gen-class
|
3458
|
+
respectively, except the arguments are unevaluated and need not be
|
3459
|
+
quoted. (:gen-class ...), when supplied, defaults to :name
|
3460
|
+
corresponding to the ns name, :main true, :impl-ns same as ns, and
|
3461
|
+
:init-impl-ns true. All options of gen-class are
|
3462
|
+
supported. The :gen-class directive is ignored when not
|
3463
|
+
compiling. If :gen-class is not supplied, when compiled only an
|
3464
|
+
nsname__init.class will be generated. If :refer-clojure is not used, a
|
3465
|
+
default (refer 'clojure) is used. Use of ns is preferred to
|
3466
|
+
individual calls to in-ns/require/use/import:
|
3467
|
+
|
3468
|
+
(ns foo.bar
|
3469
|
+
(:refer-clojure :exclude [ancestors printf])
|
3470
|
+
(:require (clojure.contrib sql sql.tests))
|
3471
|
+
(:use (my.lib this that))
|
3472
|
+
(:import (java.util Date Timer Random)
|
3473
|
+
(java.sql Connection Statement)))"
|
3474
|
+
|
3475
|
+
[name & references]
|
3476
|
+
(let [process-reference
|
3477
|
+
(fn [[kname & args]]
|
3478
|
+
`(~(symbol "clojure.core" (clojure.core/name kname))
|
3479
|
+
~@(map #(list 'quote %) args)))
|
3480
|
+
docstring (when (string? (first references)) (first references))
|
3481
|
+
references (if docstring (next references) references)
|
3482
|
+
name (if docstring
|
3483
|
+
(with-meta name (assoc (meta name)
|
3484
|
+
:doc docstring))
|
3485
|
+
name)
|
3486
|
+
gen-class-clause (first (filter #(= :gen-class (first %)) references))
|
3487
|
+
gen-class-call
|
3488
|
+
(when gen-class-clause
|
3489
|
+
(list* `gen-class :name (.replace (str name) \- \_) :impl-ns name :main true (next gen-class-clause)))
|
3490
|
+
references (remove #(= :gen-class (first %)) references)]
|
3491
|
+
`(do
|
3492
|
+
(clojure.core/in-ns '~name)
|
3493
|
+
~@(when gen-class-call (list gen-class-call))
|
3494
|
+
~@(when (and (not= name 'clojure.core) (not-any? #(= :refer-clojure (first %)) references))
|
3495
|
+
`((clojure.core/refer '~'clojure.core)))
|
3496
|
+
~@(map process-reference references))))
|
3497
|
+
|
3498
|
+
(defmacro refer-clojure
|
3499
|
+
"Same as (refer 'clojure.core <filters>)"
|
3500
|
+
[& filters]
|
3501
|
+
`(clojure.core/refer '~'clojure.core ~@filters))
|
3502
|
+
|
3503
|
+
(defmacro defonce
|
3504
|
+
"defs name to have the root value of the expr iff the named var has no root value,
|
3505
|
+
else expr is unevaluated"
|
3506
|
+
[name expr]
|
3507
|
+
`(let [v# (def ~name)]
|
3508
|
+
(when-not (.hasRoot v#)
|
3509
|
+
(def ~name ~expr))))
|
3510
|
+
|
3511
|
+
;;;;;;;;;;; require/use/load, contributed by Stephen C. Gilardi ;;;;;;;;;;;;;;;;;;
|
3512
|
+
|
3513
|
+
(defonce
|
3514
|
+
#^{:private true
|
3515
|
+
:doc "A ref to a sorted set of symbols representing loaded libs"}
|
3516
|
+
*loaded-libs* (ref (sorted-set)))
|
3517
|
+
|
3518
|
+
(defonce
|
3519
|
+
#^{:private true
|
3520
|
+
:doc "the set of paths currently being loaded by this thread"}
|
3521
|
+
*pending-paths* #{})
|
3522
|
+
|
3523
|
+
(defonce
|
3524
|
+
#^{:private true :doc
|
3525
|
+
"True while a verbose load is pending"}
|
3526
|
+
*loading-verbosely* false)
|
3527
|
+
|
3528
|
+
(defn- throw-if
|
3529
|
+
"Throws an exception with a message if pred is true"
|
3530
|
+
[pred fmt & args]
|
3531
|
+
(when pred
|
3532
|
+
(let [#^String message (apply format fmt args)
|
3533
|
+
exception (Exception. message)
|
3534
|
+
raw-trace (.getStackTrace exception)
|
3535
|
+
boring? #(not= (.getMethodName #^StackTraceElement %) "doInvoke")
|
3536
|
+
trace (into-array (drop 2 (drop-while boring? raw-trace)))]
|
3537
|
+
(.setStackTrace exception trace)
|
3538
|
+
(throw exception))))
|
3539
|
+
|
3540
|
+
(defn- libspec?
|
3541
|
+
"Returns true if x is a libspec"
|
3542
|
+
[x]
|
3543
|
+
(or (symbol? x)
|
3544
|
+
(and (vector? x)
|
3545
|
+
(or
|
3546
|
+
(nil? (second x))
|
3547
|
+
(keyword? (second x))))))
|
3548
|
+
|
3549
|
+
(defn- prependss
|
3550
|
+
"Prepends a symbol or a seq to coll"
|
3551
|
+
[x coll]
|
3552
|
+
(if (symbol? x)
|
3553
|
+
(cons x coll)
|
3554
|
+
(concat x coll)))
|
3555
|
+
|
3556
|
+
(defn- root-resource
|
3557
|
+
"Returns the root directory path for a lib"
|
3558
|
+
{:tag String}
|
3559
|
+
[lib]
|
3560
|
+
(str \/
|
3561
|
+
(.. (name lib)
|
3562
|
+
(replace \- \_)
|
3563
|
+
(replace \. \/))))
|
3564
|
+
|
3565
|
+
(defn- root-directory
|
3566
|
+
"Returns the root resource path for a lib"
|
3567
|
+
[lib]
|
3568
|
+
(let [d (root-resource lib)]
|
3569
|
+
(subs d 0 (.lastIndexOf d "/"))))
|
3570
|
+
|
3571
|
+
(def load)
|
3572
|
+
|
3573
|
+
(defn- load-one
|
3574
|
+
"Loads a lib given its name. If need-ns, ensures that the associated
|
3575
|
+
namespace exists after loading. If require, records the load so any
|
3576
|
+
duplicate loads can be skipped."
|
3577
|
+
[lib need-ns require]
|
3578
|
+
(load (root-resource lib))
|
3579
|
+
(throw-if (and need-ns (not (find-ns lib)))
|
3580
|
+
"namespace '%s' not found after loading '%s'"
|
3581
|
+
lib (root-resource lib))
|
3582
|
+
(when require
|
3583
|
+
(dosync
|
3584
|
+
(commute *loaded-libs* conj lib))))
|
3585
|
+
|
3586
|
+
(defn- load-all
|
3587
|
+
"Loads a lib given its name and forces a load of any libs it directly or
|
3588
|
+
indirectly loads. If need-ns, ensures that the associated namespace
|
3589
|
+
exists after loading. If require, records the load so any duplicate loads
|
3590
|
+
can be skipped."
|
3591
|
+
[lib need-ns require]
|
3592
|
+
(dosync
|
3593
|
+
(commute *loaded-libs* #(reduce conj %1 %2)
|
3594
|
+
(binding [*loaded-libs* (ref (sorted-set))]
|
3595
|
+
(load-one lib need-ns require)
|
3596
|
+
@*loaded-libs*))))
|
3597
|
+
|
3598
|
+
(defn- load-lib
|
3599
|
+
"Loads a lib with options"
|
3600
|
+
[prefix lib & options]
|
3601
|
+
(throw-if (and prefix (pos? (.indexOf (name lib) (int \.))))
|
3602
|
+
"lib names inside prefix lists must not contain periods")
|
3603
|
+
(let [lib (if prefix (symbol (str prefix \. lib)) lib)
|
3604
|
+
opts (apply hash-map options)
|
3605
|
+
{:keys [as reload reload-all require use verbose]} opts
|
3606
|
+
loaded (contains? @*loaded-libs* lib)
|
3607
|
+
load (cond reload-all
|
3608
|
+
load-all
|
3609
|
+
(or reload (not require) (not loaded))
|
3610
|
+
load-one)
|
3611
|
+
need-ns (or as use)
|
3612
|
+
filter-opts (select-keys opts '(:exclude :only :rename))]
|
3613
|
+
(binding [*loading-verbosely* (or *loading-verbosely* verbose)]
|
3614
|
+
(if load
|
3615
|
+
(load lib need-ns require)
|
3616
|
+
(throw-if (and need-ns (not (find-ns lib)))
|
3617
|
+
"namespace '%s' not found" lib))
|
3618
|
+
(when (and need-ns *loading-verbosely*)
|
3619
|
+
(printf "(clojure.core/in-ns '%s)\n" (ns-name *ns*)))
|
3620
|
+
(when as
|
3621
|
+
(when *loading-verbosely*
|
3622
|
+
(printf "(clojure.core/alias '%s '%s)\n" as lib))
|
3623
|
+
(alias as lib))
|
3624
|
+
(when use
|
3625
|
+
(when *loading-verbosely*
|
3626
|
+
(printf "(clojure.core/refer '%s" lib)
|
3627
|
+
(doseq [opt filter-opts]
|
3628
|
+
(printf " %s '%s" (key opt) (print-str (val opt))))
|
3629
|
+
(printf ")\n"))
|
3630
|
+
(apply refer lib (mapcat seq filter-opts))))))
|
3631
|
+
|
3632
|
+
(defn- load-libs
|
3633
|
+
"Loads libs, interpreting libspecs, prefix lists, and flags for
|
3634
|
+
forwarding to load-lib"
|
3635
|
+
[& args]
|
3636
|
+
(let [flags (filter keyword? args)
|
3637
|
+
opts (interleave flags (repeat true))
|
3638
|
+
args (filter (complement keyword?) args)]
|
3639
|
+
(doseq [arg args]
|
3640
|
+
(if (libspec? arg)
|
3641
|
+
(apply load-lib nil (prependss arg opts))
|
3642
|
+
(let [[prefix & args] arg]
|
3643
|
+
(throw-if (nil? prefix) "prefix cannot be nil")
|
3644
|
+
(doseq [arg args]
|
3645
|
+
(apply load-lib prefix (prependss arg opts))))))))
|
3646
|
+
|
3647
|
+
;; Public
|
3648
|
+
|
3649
|
+
(defn require
|
3650
|
+
"Loads libs, skipping any that are already loaded. Each argument is
|
3651
|
+
either a libspec that identifies a lib, a prefix list that identifies
|
3652
|
+
multiple libs whose names share a common prefix, or a flag that modifies
|
3653
|
+
how all the identified libs are loaded. Use :require in the ns macro
|
3654
|
+
in preference to calling this directly.
|
3655
|
+
|
3656
|
+
Libs
|
3657
|
+
|
3658
|
+
A 'lib' is a named set of resources in classpath whose contents define a
|
3659
|
+
library of Clojure code. Lib names are symbols and each lib is associated
|
3660
|
+
with a Clojure namespace and a Java package that share its name. A lib's
|
3661
|
+
name also locates its root directory within classpath using Java's
|
3662
|
+
package name to classpath-relative path mapping. All resources in a lib
|
3663
|
+
should be contained in the directory structure under its root directory.
|
3664
|
+
All definitions a lib makes should be in its associated namespace.
|
3665
|
+
|
3666
|
+
'require loads a lib by loading its root resource. The root resource path
|
3667
|
+
is derived from the root directory path by repeating its last component
|
3668
|
+
and appending '.clj'. For example, the lib 'x.y.z has root directory
|
3669
|
+
<classpath>/x/y/z; root resource <classpath>/x/y/z/z.clj. The root
|
3670
|
+
resource should contain code to create the lib's namespace and load any
|
3671
|
+
additional lib resources.
|
3672
|
+
|
3673
|
+
Libspecs
|
3674
|
+
|
3675
|
+
A libspec is a lib name or a vector containing a lib name followed by
|
3676
|
+
options expressed as sequential keywords and arguments.
|
3677
|
+
|
3678
|
+
Recognized options: :as
|
3679
|
+
:as takes a symbol as its argument and makes that symbol an alias to the
|
3680
|
+
lib's namespace in the current namespace.
|
3681
|
+
|
3682
|
+
Prefix Lists
|
3683
|
+
|
3684
|
+
It's common for Clojure code to depend on several libs whose names have
|
3685
|
+
the same prefix. When specifying libs, prefix lists can be used to reduce
|
3686
|
+
repetition. A prefix list contains the shared prefix followed by libspecs
|
3687
|
+
with the shared prefix removed from the lib names. After removing the
|
3688
|
+
prefix, the names that remain must not contain any periods.
|
3689
|
+
|
3690
|
+
Flags
|
3691
|
+
|
3692
|
+
A flag is a keyword.
|
3693
|
+
Recognized flags: :reload, :reload-all, :verbose
|
3694
|
+
:reload forces loading of all the identified libs even if they are
|
3695
|
+
already loaded
|
3696
|
+
:reload-all implies :reload and also forces loading of all libs that the
|
3697
|
+
identified libs directly or indirectly load via require or use
|
3698
|
+
:verbose triggers printing information about each load, alias, and refer"
|
3699
|
+
|
3700
|
+
[& args]
|
3701
|
+
(apply load-libs :require args))
|
3702
|
+
|
3703
|
+
(defn use
|
3704
|
+
"Like 'require, but also refers to each lib's namespace using
|
3705
|
+
clojure.core/refer. Use :use in the ns macro in preference to calling
|
3706
|
+
this directly.
|
3707
|
+
|
3708
|
+
'use accepts additional options in libspecs: :exclude, :only, :rename.
|
3709
|
+
The arguments and semantics for :exclude, :only, and :rename are the same
|
3710
|
+
as those documented for clojure.core/refer."
|
3711
|
+
[& args] (apply load-libs :require :use args))
|
3712
|
+
|
3713
|
+
(defn loaded-libs
|
3714
|
+
"Returns a sorted set of symbols naming the currently loaded libs"
|
3715
|
+
[] @*loaded-libs*)
|
3716
|
+
|
3717
|
+
(defn load
|
3718
|
+
"Loads Clojure code from resources in classpath. A path is interpreted as
|
3719
|
+
classpath-relative if it begins with a slash or relative to the root
|
3720
|
+
directory for the current namespace otherwise."
|
3721
|
+
[& paths]
|
3722
|
+
(doseq [#^String path paths]
|
3723
|
+
(let [#^String path (if (.startsWith path "/")
|
3724
|
+
path
|
3725
|
+
(str (root-directory (ns-name *ns*)) \/ path))]
|
3726
|
+
(when *loading-verbosely*
|
3727
|
+
(printf "(clojure.core/load \"%s\")\n" path)
|
3728
|
+
(flush))
|
3729
|
+
; (throw-if (*pending-paths* path)
|
3730
|
+
; "cannot load '%s' again while it is loading"
|
3731
|
+
; path)
|
3732
|
+
(when-not (*pending-paths* path)
|
3733
|
+
(binding [*pending-paths* (conj *pending-paths* path)]
|
3734
|
+
(clojure.lang.RT/load (.substring path 1)))))))
|
3735
|
+
|
3736
|
+
(defn compile
|
3737
|
+
"Compiles the namespace named by the symbol lib into a set of
|
3738
|
+
classfiles. The source for the lib must be in a proper
|
3739
|
+
classpath-relative directory. The output files will go into the
|
3740
|
+
directory specified by *compile-path*, and that directory too must
|
3741
|
+
be in the classpath."
|
3742
|
+
[lib]
|
3743
|
+
(binding [*compile-files* true]
|
3744
|
+
(load-one lib true true))
|
3745
|
+
lib)
|
3746
|
+
|
3747
|
+
;;;;;;;;;;;;; nested associative ops ;;;;;;;;;;;
|
3748
|
+
|
3749
|
+
(defn get-in
|
3750
|
+
"returns the value in a nested associative structure, where ks is a sequence of keys"
|
3751
|
+
[m ks]
|
3752
|
+
(reduce get m ks))
|
3753
|
+
|
3754
|
+
(defn assoc-in
|
3755
|
+
"Associates a value in a nested associative structure, where ks is a
|
3756
|
+
sequence of keys and v is the new value and returns a new nested structure.
|
3757
|
+
If any levels do not exist, hash-maps will be created."
|
3758
|
+
[m [k & ks] v]
|
3759
|
+
(if ks
|
3760
|
+
(assoc m k (assoc-in (get m k) ks v))
|
3761
|
+
(assoc m k v)))
|
3762
|
+
|
3763
|
+
(defn update-in
|
3764
|
+
"'Updates' a value in a nested associative structure, where ks is a
|
3765
|
+
sequence of keys and f is a function that will take the old value
|
3766
|
+
and any supplied args and return the new value, and returns a new
|
3767
|
+
nested structure. If any levels do not exist, hash-maps will be
|
3768
|
+
created."
|
3769
|
+
([m [k & ks] f & args]
|
3770
|
+
(if ks
|
3771
|
+
(assoc m k (apply update-in (get m k) ks f args))
|
3772
|
+
(assoc m k (apply f (get m k) args)))))
|
3773
|
+
|
3774
|
+
|
3775
|
+
(defn empty?
|
3776
|
+
"Returns true if coll has no items - same as (not (seq coll)).
|
3777
|
+
Please use the idiom (seq x) rather than (not (empty? x))"
|
3778
|
+
[coll] (not (seq coll)))
|
3779
|
+
|
3780
|
+
(defn coll?
|
3781
|
+
"Returns true if x implements IPersistentCollection"
|
3782
|
+
[x] (instance? clojure.lang.IPersistentCollection x))
|
3783
|
+
|
3784
|
+
(defn list?
|
3785
|
+
"Returns true if x implements IPersistentList"
|
3786
|
+
[x] (instance? clojure.lang.IPersistentList x))
|
3787
|
+
|
3788
|
+
(defn set?
|
3789
|
+
"Returns true if x implements IPersistentSet"
|
3790
|
+
[x] (instance? clojure.lang.IPersistentSet x))
|
3791
|
+
|
3792
|
+
(defn ifn?
|
3793
|
+
"Returns true if x implements IFn. Note that many data structures
|
3794
|
+
(e.g. sets and maps) implement IFn"
|
3795
|
+
[x] (instance? clojure.lang.IFn x))
|
3796
|
+
|
3797
|
+
(defn fn?
|
3798
|
+
"Returns true if x implements Fn, i.e. is an object created via fn."
|
3799
|
+
[x] (instance? clojure.lang.Fn x))
|
3800
|
+
|
3801
|
+
|
3802
|
+
(defn associative?
|
3803
|
+
"Returns true if coll implements Associative"
|
3804
|
+
[coll] (instance? clojure.lang.Associative coll))
|
3805
|
+
|
3806
|
+
(defn sequential?
|
3807
|
+
"Returns true if coll implements Sequential"
|
3808
|
+
[coll] (instance? clojure.lang.Sequential coll))
|
3809
|
+
|
3810
|
+
(defn sorted?
|
3811
|
+
"Returns true if coll implements Sorted"
|
3812
|
+
[coll] (instance? clojure.lang.Sorted coll))
|
3813
|
+
|
3814
|
+
(defn counted?
|
3815
|
+
"Returns true if coll implements count in constant time"
|
3816
|
+
[coll] (instance? clojure.lang.Counted coll))
|
3817
|
+
|
3818
|
+
(defn reversible?
|
3819
|
+
"Returns true if coll implements Reversible"
|
3820
|
+
[coll] (instance? clojure.lang.Reversible coll))
|
3821
|
+
|
3822
|
+
(def
|
3823
|
+
#^{:doc "bound in a repl thread to the most recent value printed"}
|
3824
|
+
*1)
|
3825
|
+
|
3826
|
+
(def
|
3827
|
+
#^{:doc "bound in a repl thread to the second most recent value printed"}
|
3828
|
+
*2)
|
3829
|
+
|
3830
|
+
(def
|
3831
|
+
#^{:doc "bound in a repl thread to the third most recent value printed"}
|
3832
|
+
*3)
|
3833
|
+
|
3834
|
+
(def
|
3835
|
+
#^{:doc "bound in a repl thread to the most recent exception caught by the repl"}
|
3836
|
+
*e)
|
3837
|
+
|
3838
|
+
(defmacro declare
|
3839
|
+
"defs the supplied var names with no bindings, useful for making forward declarations."
|
3840
|
+
[& names] `(do ~@(map #(list 'def %) names)))
|
3841
|
+
|
3842
|
+
(defn trampoline
|
3843
|
+
"trampoline can be used to convert algorithms requiring mutual
|
3844
|
+
recursion without stack consumption. Calls f with supplied args, if
|
3845
|
+
any. If f returns a fn, calls that fn with no arguments, and
|
3846
|
+
continues to repeat, until the return value is not a fn, then
|
3847
|
+
returns that non-fn value. Note that if you want to return a fn as a
|
3848
|
+
final value, you must wrap it in some data structure and unpack it
|
3849
|
+
after trampoline returns."
|
3850
|
+
([f]
|
3851
|
+
(let [ret (f)]
|
3852
|
+
(if (fn? ret)
|
3853
|
+
(recur ret)
|
3854
|
+
ret)))
|
3855
|
+
([f & args]
|
3856
|
+
(trampoline #(apply f args))))
|
3857
|
+
|
3858
|
+
(defn intern
|
3859
|
+
"Finds or creates a var named by the symbol name in the namespace
|
3860
|
+
ns (which can be a symbol or a namespace), setting its root binding
|
3861
|
+
to val if supplied. The namespace must exist. The var will adopt any
|
3862
|
+
metadata from the name symbol. Returns the var."
|
3863
|
+
([ns #^clojure.lang.Symbol name]
|
3864
|
+
(let [v (clojure.lang.Var/intern (the-ns ns) name)]
|
3865
|
+
(when ^name (.setMeta v ^name))
|
3866
|
+
v))
|
3867
|
+
([ns name val]
|
3868
|
+
(let [v (clojure.lang.Var/intern (the-ns ns) name val)]
|
3869
|
+
(when ^name (.setMeta v ^name))
|
3870
|
+
v)))
|
3871
|
+
|
3872
|
+
(defmacro while
|
3873
|
+
"Repeatedly executes body while test expression is true. Presumes
|
3874
|
+
some side-effect will cause test to become false/nil. Returns nil"
|
3875
|
+
[test & body]
|
3876
|
+
`(loop []
|
3877
|
+
(when ~test
|
3878
|
+
~@body
|
3879
|
+
(recur))))
|
3880
|
+
|
3881
|
+
(defn memoize
|
3882
|
+
"Returns a memoized version of a referentially transparent function. The
|
3883
|
+
memoized version of the function keeps a cache of the mapping from arguments
|
3884
|
+
to results and, when calls with the same arguments are repeated often, has
|
3885
|
+
higher performance at the expense of higher memory use."
|
3886
|
+
[f]
|
3887
|
+
(let [mem (atom {})]
|
3888
|
+
(fn [& args]
|
3889
|
+
(if-let [e (find @mem args)]
|
3890
|
+
(val e)
|
3891
|
+
(let [ret (apply f args)]
|
3892
|
+
(swap! mem assoc args ret)
|
3893
|
+
ret)))))
|
3894
|
+
|
3895
|
+
(defmacro condp
|
3896
|
+
"Takes a binary predicate, an expression, and a set of clauses.
|
3897
|
+
Each clause can take the form of either:
|
3898
|
+
|
3899
|
+
test-expr result-expr
|
3900
|
+
|
3901
|
+
test-expr :>> result-fn
|
3902
|
+
|
3903
|
+
Note :>> is an ordinary keyword.
|
3904
|
+
|
3905
|
+
For each clause, (pred test-expr expr) is evaluated. If it returns
|
3906
|
+
logical true, the clause is a match. If a binary clause matches, the
|
3907
|
+
result-expr is returned, if a ternary clause matches, its result-fn,
|
3908
|
+
which must be a unary function, is called with the result of the
|
3909
|
+
predicate as its argument, the result of that call being the return
|
3910
|
+
value of condp. A single default expression can follow the clauses,
|
3911
|
+
and its value will be returned if no clause matches. If no default
|
3912
|
+
expression is provided and no clause matches, an
|
3913
|
+
IllegalArgumentException is thrown."
|
3914
|
+
|
3915
|
+
[pred expr & clauses]
|
3916
|
+
(let [gpred (gensym "pred__")
|
3917
|
+
gexpr (gensym "expr__")
|
3918
|
+
emit (fn emit [pred expr args]
|
3919
|
+
(let [[[a b c :as clause] more]
|
3920
|
+
(split-at (if (= :>> (second args)) 3 2) args)
|
3921
|
+
n (count clause)]
|
3922
|
+
(cond
|
3923
|
+
(= 0 n) `(throw (IllegalArgumentException. (str "No matching clause: " ~expr)))
|
3924
|
+
(= 1 n) a
|
3925
|
+
(= 2 n) `(if (~pred ~a ~expr)
|
3926
|
+
~b
|
3927
|
+
~(emit pred expr more))
|
3928
|
+
:else `(if-let [p# (~pred ~a ~expr)]
|
3929
|
+
(~c p#)
|
3930
|
+
~(emit pred expr more)))))
|
3931
|
+
gres (gensym "res__")]
|
3932
|
+
`(let [~gpred ~pred
|
3933
|
+
~gexpr ~expr]
|
3934
|
+
~(emit gpred gexpr clauses))))
|
3935
|
+
|
3936
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; var documentation ;;;;;;;;;;;;;;;;;;;;;;;;;;
|
3937
|
+
|
3938
|
+
(defmacro add-doc {:private true} [name docstring]
|
3939
|
+
`(alter-meta! (var ~name) assoc :doc ~docstring))
|
3940
|
+
|
3941
|
+
(add-doc *file*
|
3942
|
+
"The path of the file being evaluated, as a String.
|
3943
|
+
|
3944
|
+
Evaluates to nil when there is no file, eg. in the REPL.")
|
3945
|
+
|
3946
|
+
(add-doc *command-line-args*
|
3947
|
+
"A sequence of the supplied command line arguments, or nil if
|
3948
|
+
none were supplied")
|
3949
|
+
|
3950
|
+
(add-doc *warn-on-reflection*
|
3951
|
+
"When set to true, the compiler will emit warnings when reflection is
|
3952
|
+
needed to resolve Java method calls or field accesses.
|
3953
|
+
|
3954
|
+
Defaults to false.")
|
3955
|
+
|
3956
|
+
(add-doc *compile-path*
|
3957
|
+
"Specifies the directory where 'compile' will write out .class
|
3958
|
+
files. This directory must be in the classpath for 'compile' to
|
3959
|
+
work.
|
3960
|
+
|
3961
|
+
Defaults to \"classes\"")
|
3962
|
+
|
3963
|
+
(add-doc *compile-files*
|
3964
|
+
"Set to true when compiling files, false otherwise.")
|
3965
|
+
|
3966
|
+
(add-doc *ns*
|
3967
|
+
"A clojure.lang.Namespace object representing the current namespace.")
|
3968
|
+
|
3969
|
+
(add-doc *in*
|
3970
|
+
"A java.io.Reader object representing standard input for read operations.
|
3971
|
+
|
3972
|
+
Defaults to System/in, wrapped in a LineNumberingPushbackReader")
|
3973
|
+
|
3974
|
+
(add-doc *out*
|
3975
|
+
"A java.io.Writer object representing standard output for print operations.
|
3976
|
+
|
3977
|
+
Defaults to System/out")
|
3978
|
+
|
3979
|
+
(add-doc *err*
|
3980
|
+
"A java.io.Writer object representing standard error for print operations.
|
3981
|
+
|
3982
|
+
Defaults to System/err, wrapped in a PrintWriter")
|
3983
|
+
|
3984
|
+
(add-doc *flush-on-newline*
|
3985
|
+
"When set to true, output will be flushed whenever a newline is printed.
|
3986
|
+
|
3987
|
+
Defaults to true.")
|
3988
|
+
|
3989
|
+
(add-doc *print-meta*
|
3990
|
+
"If set to logical true, when printing an object, its metadata will also
|
3991
|
+
be printed in a form that can be read back by the reader.
|
3992
|
+
|
3993
|
+
Defaults to false.")
|
3994
|
+
|
3995
|
+
(add-doc *print-dup*
|
3996
|
+
"When set to logical true, objects will be printed in a way that preserves
|
3997
|
+
their type when read in later.
|
3998
|
+
|
3999
|
+
Defaults to false.")
|
4000
|
+
|
4001
|
+
(add-doc *print-readably*
|
4002
|
+
"When set to logical false, strings and characters will be printed with
|
4003
|
+
non-alphanumeric characters converted to the appropriate escape sequences.
|
4004
|
+
|
4005
|
+
Defaults to true")
|
4006
|
+
|
4007
|
+
(add-doc *read-eval*
|
4008
|
+
"When set to logical false, the EvalReader (#=(...)) is disabled in the
|
4009
|
+
read/load in the thread-local binding.
|
4010
|
+
Example: (binding [*read-eval* false] (read-string \"#=(eval (def x 3))\"))
|
4011
|
+
|
4012
|
+
Defaults to true")
|
4013
|
+
|
4014
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; helper files ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
4015
|
+
(alter-meta! (find-ns 'clojure.core) assoc :doc "Fundamental library of the Clojure language")
|
4016
|
+
(load "core_proxy")
|
4017
|
+
(load "core_print")
|
4018
|
+
(load "genclass")
|
4019
|
+
|
4020
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; futures (needs proxy);;;;;;;;;;;;;;;;;;
|
4021
|
+
(defn future-call
|
4022
|
+
"Takes a function of no args and yields a future object that will
|
4023
|
+
invoke the function in another thread, and will cache the result and
|
4024
|
+
return it on all subsequent calls to deref/@. If the computation has
|
4025
|
+
not yet finished, calls to deref/@ will block."
|
4026
|
+
[#^Callable f]
|
4027
|
+
(let [fut (.submit clojure.lang.Agent/soloExecutor f)]
|
4028
|
+
(proxy [clojure.lang.IDeref java.util.concurrent.Future] []
|
4029
|
+
(deref [] (.get fut))
|
4030
|
+
(get ([] (.get fut))
|
4031
|
+
([timeout unit] (.get fut timeout unit)))
|
4032
|
+
(isCancelled [] (.isCancelled fut))
|
4033
|
+
(isDone [] (.isDone fut))
|
4034
|
+
(cancel [interrupt?] (.cancel fut interrupt?)))))
|
4035
|
+
|
4036
|
+
(defmacro future
|
4037
|
+
"Takes a body of expressions and yields a future object that will
|
4038
|
+
invoke the body in another thread, and will cache the result and
|
4039
|
+
return it on all subsequent calls to deref/@. If the computation has
|
4040
|
+
not yet finished, calls to deref/@ will block."
|
4041
|
+
[& body] `(future-call (fn [] ~@body)))
|
4042
|
+
|
4043
|
+
(defn pmap
|
4044
|
+
"Like map, except f is applied in parallel. Semi-lazy in that the
|
4045
|
+
parallel computation stays ahead of the consumption, but doesn't
|
4046
|
+
realize the entire result unless required. Only useful for
|
4047
|
+
computationally intensive functions where the time of f dominates
|
4048
|
+
the coordination overhead."
|
4049
|
+
([f coll]
|
4050
|
+
(let [n (+ 2 (.. Runtime getRuntime availableProcessors))
|
4051
|
+
rets (map #(future (f %)) coll)
|
4052
|
+
step (fn step [[x & xs :as vs] fs]
|
4053
|
+
(lazy-seq
|
4054
|
+
(if-let [s (seq fs)]
|
4055
|
+
(cons (deref x) (step xs (rest s)))
|
4056
|
+
(map deref vs))))]
|
4057
|
+
(step rets (drop n rets))))
|
4058
|
+
([f coll & colls]
|
4059
|
+
(let [step (fn step [cs]
|
4060
|
+
(lazy-seq
|
4061
|
+
(let [ss (map seq cs)]
|
4062
|
+
(when (every? identity ss)
|
4063
|
+
(cons (map first ss) (step (map rest ss)))))))]
|
4064
|
+
(pmap #(apply f %) (step (cons coll colls))))))
|
4065
|
+
|
4066
|
+
(defn pcalls
|
4067
|
+
"Executes the no-arg fns in parallel, returning a lazy sequence of
|
4068
|
+
their values"
|
4069
|
+
[& fns] (pmap #(%) fns))
|
4070
|
+
|
4071
|
+
(defmacro pvalues
|
4072
|
+
"Returns a lazy sequence of the values of the exprs, which are
|
4073
|
+
evaluated in parallel"
|
4074
|
+
[& exprs]
|
4075
|
+
`(pcalls ~@(map #(list `fn [] %) exprs)))
|
4076
|
+
|
4077
|
+
(defmacro letfn
|
4078
|
+
"Takes a vector of function specs and a body, and generates a set of
|
4079
|
+
bindings of functions to their names. All of the names are available
|
4080
|
+
in all of the definitions of the functions, as well as the body.
|
4081
|
+
|
4082
|
+
fnspec ==> (fname [params*] exprs) or (fname ([params*] exprs)+)"
|
4083
|
+
[fnspecs & body]
|
4084
|
+
`(letfn* ~(vec (interleave (map first fnspecs)
|
4085
|
+
(map #(cons `fn %) fnspecs)))
|
4086
|
+
~@body))
|
4087
|
+
|
4088
|
+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; clojure version number ;;;;;;;;;;;;;;;;;;;;;;
|
4089
|
+
|
4090
|
+
(let [version-stream (.getResourceAsStream (clojure.lang.RT/baseLoader)
|
4091
|
+
"clojure/version.properties")
|
4092
|
+
properties (doto (new java.util.Properties) (.load version-stream))
|
4093
|
+
prop (fn [k] (.getProperty properties (str "clojure.version." k)))
|
4094
|
+
clojure-version {:major (Integer/valueOf (prop "major"))
|
4095
|
+
:minor (Integer/valueOf (prop "minor"))
|
4096
|
+
:incremental (Integer/valueOf (prop "incremental"))
|
4097
|
+
:qualifier (prop "qualifier")}]
|
4098
|
+
(def *clojure-version*
|
4099
|
+
(if (not (= (prop "interim") "false"))
|
4100
|
+
(clojure.lang.RT/assoc clojure-version :interim true)
|
4101
|
+
clojure-version)))
|
4102
|
+
|
4103
|
+
(add-doc *clojure-version*
|
4104
|
+
"The version info for Clojure core, as a map containing :major :minor
|
4105
|
+
:incremental and :qualifier keys. Feature releases may increment
|
4106
|
+
:minor and/or :major, bugfix releases will increment :incremental.
|
4107
|
+
Possible values of :qualifier include \"GA\", \"SNAPSHOT\", \"RC-x\" \"BETA-x\"")
|
4108
|
+
|
4109
|
+
(defn
|
4110
|
+
clojure-version
|
4111
|
+
"Returns clojure version as a printable string."
|
4112
|
+
[]
|
4113
|
+
(str (:major *clojure-version*)
|
4114
|
+
"."
|
4115
|
+
(:minor *clojure-version*)
|
4116
|
+
(when-let [i (:incremental *clojure-version*)]
|
4117
|
+
(str "." i))
|
4118
|
+
(when-let [q (:qualifier *clojure-version*)]
|
4119
|
+
(str "-" q))
|
4120
|
+
(when (:interim *clojure-version*)
|
4121
|
+
"-SNAPSHOT")))
|