7. (nth s 2)
(java.lang.reflect.Array/get s 2)
(.get ^java.util.RandomAccess s 2)
(.nth ^clojure.lang.Indexed s 2)
(Character. (.charAt ^CharSequence s 2))
(first (next (next s)))
36. public final class user$log extends clojure.lang.AFunction {
public static {};
...
public user$log();
...
public java.lang.Object invoke(java.lang.Object x);
...
}
46. static public Number add(Object x, Object y){
return ops(x).combine(ops(y)).add((Number)x, (Number)y);
}
class LongOps {
final public Number add(Number x, Number y){
return num(Numbers.add(x.longValue(),y.longValue()));
}
}
static public long add(long x, long y){
long ret = x + y;
if ((ret ^ x) < 0 && (ret ^ y) < 0)
return throwIntOverflow();
return ret;
}
(fn [x y] (+ x y))
47. (fn [^long x ^long y] (+ x y))
public final java.lang.Object invokePrim(long x, long arg1);
0 lload_1 [x]
1 lload_3
2 invokestatic clojure.lang.Numbers.add(long, long) : long
5 invokestatic clojure.lang.Numbers.num(long) : java.lang.Number
8 areturn
48. (fn ^long [^long x ^long x] (+ x y))
public final long invokePrim(long x, long arg1);
0 lload_1 [x]
1 lload_3
2 invokestatic clojure.lang.Numbers.add(long, long) : long
5 lreturn
49. (fn ^long [^long x ^long y] (unchecked-add x y))
public final long invokePrim(long x, long arg1);
0 lload_1 [x]
1 lload_3
2 ladd
5 lreturn
50. (fn ^long [^long x ^long y] (unchecked-add x y))
AS FAST AS JAVA!
public final long invokePrim(long x, long arg1);
0 lload_1 [x]
1 lload_3
2 ladd
5 lreturn
53. public class Primitives {
!
…
!
public static long add(long a, long b) {
return a + b;
}
public static double add(double a, double b) {
return a + b;
}
!
…
!
}
55. (fn ^long [^long x ^long y] (p/+ x y))
public final long invokePrim(long x, long arg1);
0 lload_1 [x]
1 lload_3
2 invokestatic primitive_math.Primitives.add(long, long) : long
5 lreturn
56. > (set! *warn-on-reflection* true)
true
!
> (fn [x y] (unchecked-add x y))
#<...>
!
> (fn [x y] (p/+ x y))
Reflection warning - call to add can't be resolved.
#<...>
57. • does not supplant Clojure’s numerics
• invariants via feedback when they aren’t
satisfied
• using Java isn’t cheating
80. SOME FINALTHOUGHTS
• be curious about the tools you use
• if you’re going for a bounded solution, describe the
boundaries fully
• if you’re going for a general solution, make sure it’s
actually general