$30 off During Our Annual Pro Sale. View Details »

CIDER: Rocking with Clojure and Emacs

CIDER: Rocking with Clojure and Emacs

Slide deck from my buildstuff.lt 2015 presentation.

Bozhidar Batsov

November 20, 2015
Tweet

More Decks by Bozhidar Batsov

Other Decks in Programming

Transcript

  1. CIDER:
    Rocking with
    Clojure and Emacs
    narrated by Bozhidar I. Batsov

    View Slide

  2. Sveiki!

    View Slide

  3. į sveikatą!

    View Slide

  4. @bbatsov

    View Slide

  5. Bulgaria

    View Slide

  6. View Slide

  7. Bug

    View Slide

  8. View Slide

  9. View Slide

  10. A (Dark) Knight of
    the
    Order of Emacs

    View Slide

  11. View Slide

  12. View Slide

  13. Why I am here?

    View Slide

  14. I am a storyteller!

    View Slide

  15. View Slide

  16. A story about a different kind
    of cider…

    View Slide

  17. Which is your primary Clojure dev
    environment? (2014)
    Other
    13%
    LightTable
    12%
    CCW
    5%
    fireplace
    14% Cursive
    14%
    CIDER
    42%

    View Slide

  18. –Nancy Pearcey
    “Competition is always a good thing. It
    forces us to do our best. A monopoly
    renders people complacent and satisfied
    with mediocrity.”

    View Slide

  19. Near future
    Others
    10%
    CIDER
    90%

    View Slide

  20. Near future
    Cursive
    25%
    Others
    15%
    CIDER
    60%

    View Slide

  21. A not so long time ago in a
    galaxy not far away…

    View Slide

  22. Java, C# and PHP ruled the
    dev world

    View Slide

  23. The Lisp Masters from the
    Republic of Great Programmers
    were on the run

    View Slide

  24. Lisps were out of
    fashion

    View Slide

  25. 2007

    View Slide

  26. A gentleman
    &
    a scholar

    View Slide

  27. Clojure

    View Slide

  28. Biggest Clojure problem at
    launch?

    View Slide

  29. ((((((((((()))))))))))

    View Slide

  30. 0
    Clojure
    development
    environments

    View Slide

  31. Emacs was the last Lisp
    stronghold

    View Slide

  32. Emacs is the greatest Emacs
    Lisp dev environment

    View Slide

  33. SLIME

    View Slide

  34. Superior
    Lisp
    Interaction
    Mode for
    Emacs

    View Slide

  35. SLIME Features
    • REPL
    • Interactive evaluation
    • Compilation notes
    • Code completion
    • Definition lookup
    • Documentation lookup
    • Apropos

    View Slide

  36. SLIME Features
    • Debugger
    • Value inspector
    • Tracing
    • Find usages
    • Macroexpansion
    • Scratchpad
    • Minibuffer code evaluation

    View Slide

  37. SLIME is an IDE

    View Slide

  38. Interactive Development
    Environment

    View Slide

  39. Programs are built in a very
    incremental manner

    View Slide

  40. SLIME
    (Emacs Lisp)
    SWANK
    (Common Lisp)
    Clozure
    RPC
    LispWorks
    CMUCL
    ABCL
    SBCL
    Client Server Backends

    View Slide

  41. 2008

    View Slide

  42. clojure-mode
    &
    swank-clojure

    View Slide

  43. SLIME
    (Emacs Lisp)
    SWANK
    (Common Lisp)
    swank-clojure

    View Slide

  44. A star was born

    View Slide

  45. swank-clojure
    • Requires knowledge of swank (Common Lisp)
    • Bundles a frozen SLIME version
    • Subpar features (e.g. debugger, inspector, find usages)
    • Monolithic (no swank plugins)

    View Slide

  46. SLIME is a
    Common Lisp
    tool

    View Slide

  47. 2010

    View Slide

  48. Another esteemed
    gentleman
    &
    scholar

    View Slide

  49. nREPL

    View Slide

  50. A common foundation
    for Clojure development tools

    View Slide

  51. •Load (compile) a Clojure source file
    •Evaluate a Clojure form
    •Interrupt evaluation
    •Read from the standard input

    View Slide

  52. Extensible via middleware

    View Slide

  53. 2012

    View Slide

  54. nrepl.el

    View Slide

  55. nrepl.el
    (Emacs Lisp)
    nREPL
    (Clojure)

    View Slide

  56. A workhorse is retired

    View Slide

  57. nrepl.el
    • lacked many SLIME features
    • relied heavily on evaluation of inlined code
    • made assumptions about the environment
    • flawed bencode parser

    View Slide

  58. 2013

    View Slide

  59. Don’t settle for good.
    Demand great!

    View Slide

  60. –Phil Karlton
    “There are only two hard things in
    Computer Science: cache invalidation
    and naming things.”

    View Slide

  61. View Slide

  62. Clojure
    Integrated
    Development
    Environment &
    REPL

    View Slide

  63. Clojure
    Interactive
    Development
    Environment
    Reimagined

    View Slide

  64. Clojure
    Interactive
    Development
    Environment that
    Rocks

    View Slide

  65. View Slide

  66. (defun nrepl-jump-to-def (var)
    "Jump to the definition of the VAR at point."
    (let ((form (format "(let [ns-symbol '%s
    ns-var '%s
    ns-file (clojure.core/comp :file
    clojure.core/meta
    clojure.core/second
    clojure.core/first
    clojure.core/ns-publics)
    resource-str (clojure.core/comp clojure.core/str
    clojure.java.io/resource
    ns-file)
    file-str (clojure.core/comp clojure.core/str
    clojure.java.io/file
    ns-file)]
    (cond ((clojure.core/ns-aliases ns-symbol) ns-var)
    (let [resolved-ns ((clojure.core/ns-aliases ns-symbol) ns-var)]
    [(resource-str resolved-ns)
    (file-str resolved-ns)
    1])
    (find-ns ns-var)
    [(resource-str ns-var)
    (file-str ns-var)
    1]
    (clojure.core/ns-resolve ns-symbol ns-var)
    ((clojure.core/juxt
    (clojure.core/comp clojure.core/str
    clojure.java.io/resource
    :file)
    (clojure.core/comp clojure.core/str
    clojure.java.io/file
    :file)
    :line)
    (clojure.core/meta (clojure.core/ns-resolve ns-symbol ns-var)))))"
    (nrepl-current-ns) var)))
    (nrepl-send-string form
    (nrepl-jump-to-def-handler (current-buffer))
    nrepl-buffer-ns
    (nrepl-current-tooling-session))))
    not portable

    View Slide

  67. (defun cider-jump-to-var (&optional var line)
    "Jump to the definition of VAR, optionally at a specific LINE.
    When called interactively, this operates on point, or falls back to a prompt."
    (interactive)
    (cider-ensure-op-supported "info")
    (cider-read-symbol-name
    "Symbol: " (lambda (var)
    (-if-let (info (cider-var-info var))
    (cider--jump-to-loc-from-info info)
    (message "Symbol %s not resolved" var)))))
    portable

    View Slide

  68. CIDER Features
    • Interactive evaluation
    • Compilation notes
    • Code completion
    • Definition lookup
    • Documentation lookup
    • Apropos

    View Slide

  69. CIDER Features
    • Value inspector
    • Command selector
    • Tracing
    • Macroexpansion
    • Debugger
    • Scratchpad
    • Minibuffer code evalution

    View Slide

  70. CIDER Features
    • Javadoc support
    • Jump to Java definition
    • Jump to resource
    • Sanity-preserving stacktraces
    • clojure.test integration
    • namespace browser

    View Slide

  71. CIDER Features
    • classpath browser
    • grimoire integration
    • dynamic indentation
    • dynamic font-locking
    • nREPL session manager
    • Smart namespace reloading
    • ClojureScript support

    View Slide

  72. Extensions
    (are easy)

    View Slide

  73. Refactoring support
    (clj-refactor + refactor-nrepl)

    View Slide

  74. Demo Time

    View Slide

  75. CIDER
    tastes better than
    SLIME

    View Slide

  76. CIDER
    tastes better than
    some IDES

    View Slide

  77. What’s still missing?

    View Slide

  78. • Find usages
    • Built-in refactoring tooling
    • Better ClojureScript support
    • Support for the new Clojure socket REPL
    • A proper manual
    CIDER 1.0

    View Slide

  79. Why CIDER?

    View Slide

  80. Integrated Development
    Environment (a.k.a. IDE)

    View Slide

  81. View Slide

  82. Emacs

    View Slide

  83. View Slide

  84. View Slide

  85. View Slide

  86. View Slide

  87. View Slide

  88. Spacemacs

    View Slide

  89. Emacs users
    know how to build productive
    Lisp workflows

    View Slide

  90. •Emacs (ultimate Elisp dev env)
    •SLIME (and SLY)
    •Geiser
    •racket-mode
    •CIDER (obviously)

    View Slide

  91. • paredit
    • smartparens
    • rainbow-delimiters
    • rainbow-identifiers
    • sexp-fu
    • paxedit
    • lispy

    View Slide

  92. Community impact

    View Slide

  93. cider-nrepl
    https://github.com/clojure-emacs/cider-nrepl

    View Slide

  94. refactor-nrepl
    https://github.com/clojure-emacs/refactor-nrepl

    View Slide

  95. compliment
    https://github.com/alexander-yakushev/compliment

    View Slide

  96. cljs-tooling
    https://github.com/gtrak/cljs-tooling

    View Slide

  97. nREPL improvements

    View Slide

  98. Open development

    View Slide

  99. View Slide

  100. View Slide

  101. 126 contributors!

    View Slide

  102. Please, send more help!

    View Slide

  103. Thanks!

    View Slide

  104. Felina

    View Slide