Prácticas

Práctica 01

El objetivo es crear un proyecto para plantear la forma de trabajar con Emacs.

  1. Crea un directorio para manterner tus proyectos en él, $HOME/code/clojure por ejemplo, e ingresa a éĺ:

     alumno@servidor:~ $ mkdir -p code/clojure
     alumno@servidor:~ $ cd code/clojure
    
  2. Crea el proyecto con la plantilla (template) default e ingresa a él:

     alumno@servidor:~/code/clojure $ lein new default clojure01
     Generating a project called clojure01 based on the 'default' template.
     The default template is intended for library projects, not applications.
     To see other templates (app, plugin, etc), try `lein help new`.
     alumno@servidor:~/code/clojure $ cd clojure01
    

    Es posible el solo ejecutar lein new clojure01 para hacer uso de la plantilla default.

    Leiningen ofrece otras plantillas, de momento solo app (para desarrollar una aplicación) y default (para desarrollar una librería) son de interes. Existe una gran cantidad de plantillas disponibles en Clojars.org.

    Al terminar contarás con ls siguiente estructura en clojure01:

     alumno@servidor:~/code/clojure/clojure01 $ pwd && tree
     /home/alumno/code/clojure/clojure01
     .
     ├── CHANGELOG.md
     ├── doc
     │   └── intro.md
     ├── LICENSE
     ├── project.clj
     ├── README.md
     ├── resources
     ├── src
     │   └── clojure01
     │       └── core.clj
     └── test
         └── clojure01
             └── core_test.clj
     6 directories, 7 files
    

    El archivo project.clj es el archivo de definición del proyecto y contiene, entre otras cosas, las dependencias necesarias para él mismo:

     (defproject clojure01 "0.1.0-SNAPSHOT"
       :description "FIXME: write description"
       :url "http://example.com/FIXME"
       :license {:name "Eclipse Public License"
                 :url "http://www.eclipse.org/legal/epl-v10.html"}
       :dependencies [[org.clojure/clojure "1.8.0"]])
    

    IMPORTANTE: si se está haciendo uso de Drip debe modificarse este archivo para indicar su uso mediante el keyword java-cmd en defproject:

     (defproject clojure01 "0.1.0-SNAPSHOT"
       :java-cmd "drip"
       :description "FIXME: write description"
       ...)
    
  3. Inicia a Emacs estando en el directorio ~/code/clojure/clojure01 (emacs .) y aprieta el juego de teclas M-x cider-jack-in RET para iniciar un servidor-cliente de nREPL ofrecido por CIDER

    La manera en como uno programa en Clojure mediante Leiningen, Emacs y CIDER (REPL)se puede leer en:

Práctica 02

El objetivo es crear un proyecto para iniciar una aplicación, Leiningen ofrece la tarea (task) new y la plantilla (template) app para esto.

  1. Crea el proyecto con la plantilla (template) app e ingresa a él:

     alumno@servidor:~ $ cd code/clojure
     alumno@servidor:~/code/clojure $ lein new app clojure02
     Generating a project called clojure02 based on the 'app' template.
     alumno@servidor:~/code/clojure $ cd clojure02
    

    Al terminar contarás con la siguiente estructura en clojure02:

     alumno@servidor:~/code/clojure/clojure02 $ pwd && tree
     /home/alumno/code/clojure/clojure02
     .
     ├── CHANGELOG.md
     ├── doc
     │   └── intro.md
     ├── LICENSE
     ├── project.clj
     ├── README.md
     ├── resources
     ├── src
     │   └── clojure02
     │       └── core.clj
     └── test
         └── clojure02
             └── core_test.clj
     6 directories, 7 files
    

    El archivo project.clj es el archivo de definición del proyecto y contiene, entre otras cosas, las dependencias necesarias para él mismo:

     (defproject clojure02 "0.1.0-SNAPSHOT"
       :description "FIXME: write description"
       :url "http://example.com/FIXME"
       :license {:name "Eclipse Public License"
                 :url "http://www.eclipse.org/legal/epl-v10.html"}
       :dependencies [[org.clojure/clojure "1.8.0"]]
       :main ^:skip-aot clojure02.core
       :target-path "target/%s"
       :profiles {:uberjar {:aot :all}})
    

    IMPORTANTE: si se está haciendo uso de Drip debe modificarse este archivo para indicar su uso mediante el keyword java-cmd en defproject:

     (defproject clojure02 "0.1.0-SNAPSHOT"
       :java-cmd "drip"
       :description "FIXME: write description"
       ...)
    

    El aspecto a resaltar es el uso de clojure02.core como namespace principal (:main) por lo que en él se espera la existencia de una función con nombre -main que será el punto de inicio de esta aplicación:

     (defn -main
       ...
       [& args]
       ...)
    

    Puedes encontrar todas las opciones disponibles en https://github.com/technomancy/leiningen/blob/stable/sample.project.clj.

    Hasta este punto uno tiene las siguientes tareas (task) de Leiningen disponibles:

    • lein deps: descarga las dependencias establecidas mediante :dependencies.
    • lein repl: inicia un REPL de acuerdo al proyecto actual.
    • lein run: ejecuta el proyecto (función -main del namespace principal.
    • lein test: ejecuta los tests del proyecto (archivos con extensión .clj dentro del directorio test).
    • lein compile: compila el proyecto (archivos con extensión .clj dentro del directorio src en el directorio target).
    • lein clean: borra los archivos generados durante la compilación del proyecto (archivos dentro del directorio target).
    • lein uberjar: genera un archivo JAR (Java Archive) que incluye el código fuente-compilado del proyecto y sus dependencias. El archivo generado es depositado en el directorio target/uberjar con nombre clojure02-0.1.0-SNAPSHOT-standalone.jar y su ejecución sería con el comando java -jar target/uberjar/clojure02-0.1.0-SNAPSHOT-standalone.jar.