Clojure for iOS
@galdolber
Clojure User Group Buenos Aires 2015
Zuldi
Aplicaciones integradas a POS
Server
Dashboard
POS
App
Server
Dashboard
POS
App
clojure-clr
clojurescript
clojure-objc
clojurechttps://github.com/schani/clojurec
A Clojure implementation on top of C
github.com/joshaber/clojurem
clojurem
Compiler for Clojure that targets objc
github.com/takeoutweight/clojure-scheme
clojure-scheme
Clojure to Scheme to C to the bare metal
J2OBJC
A Java to iOS Objective-C translation tool and runtime
by Google
En uso en produccion:
github.com/google/j2objc
Primer experimento:
interprete
Compilar el runtime de clojure y el
interprete a objc con J2OBJC
Implementar interprete de clojure en java
app.clj
Preprocesor:
expand macros
elide meta
opt.clj
Transpiled runtime
+ interpreter
+ optimized sources
Resultados
Que funcionaba?
- Macros
- Partes basicas de clojure.core
- Interop con objc, solo llamar metodos
Negativos
- Lento!
- Muchas funcionalidades de clojure faltantes
- Gran consumo de memoria
Positivos
- Gane mucho mejor entendimiento de como clojure funciona
internamente
- Mucho mejor arquitectura de la aplicacion
Segundo experimento:
generar java con clojure
Compilar todo a objc con J2OBJC
Modificar el compilador de clojure para que emita
java en vez de bytecode
app.clj app.java
Transpiled runtime
and app
J2OBJC
app.m
Resultados iniciales
Todo funciona! incluido muchas librerias existentes
Interop basico llamar metodos objc
Startup lento (12s para iniciar)
Muy rapido! una vez que arranca
(faster startup)
1 - Profiling
12s —> 2.3s (on iPhone 4s)
2 - Custom optimization to delay Vars creation
2.3s —> 900ms! (on iPhone 4s)
130ms! (on iPhone 6)
Interop
Extender classes de objc
Llamar metodos objc
Llamar funciones de c
lein-objcbuildhttps://github.com/galdolber/lein-objcbuild
Genera una libreria estatica
para facil uso desde XCode
Compilacion incremental…
de funciones!
Remote REPL
JVM REPL que se conecta remotamente a un dispositivo iOS
Toda llamada a interop con objc se ejecuta remotamente
REPL
Socket
Resultado final
- Construido sobre una base fuerte: clojure-jvm y J2OBJC
- Future proof: Comparte 99% del codigo con clojure
- Maven para distribuir librerias
- Muchas librerias de clojure funcionan automaticamente
- Librerias para objc son accesibles con objc interop
- Manejo de memoria automatico con J2OBJC
- REPL!
Demo
Gracias!
https://github.com/galdolber/clojure-objc

clojure-objc