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

The Evolution of the Clojure Tooling for Emacs

The Evolution of the Clojure Tooling for Emacs

Slides from my Clojure/conj 2014 talk

Bozhidar Batsov

November 20, 2014
Tweet

More Decks by Bozhidar Batsov

Other Decks in Programming

Transcript

  1. The
    Evolution
    of the
    Clojure tooling
    for
    Emacs
    narrated by Bozhidar I. Batsov

    View Slide

  2. Hello!

    View Slide

  3. @bbatsov

    View Slide

  4. Bug

    View Slide

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

    View Slide

  6. Why I am here?

    View Slide

  7. Bulgaria

    View Slide

  8. 2013
    Other
    24%
    LightTable
    8%
    CCW
    8%
    fireplace
    10%
    Cursive
    3%
    CIDER
    48%
    2014
    Other
    13%
    LightTable
    12%
    CCW
    5%
    fireplace
    14% Cursive
    14%
    CIDER
    42%

    View Slide

  9. –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

  10. The critics

    View Slide

  11. CIDER sucks big time!

    View Slide

  12. CIDER breaks on every update!

    View Slide

  13. CIDER has become bloated and
    slow!

    View Slide

  14. CIDER’s setup is overly
    complex!

    View Slide

  15. View Slide

  16. CIDER is doing great!

    View Slide

  17. Near future
    Others
    10%
    CIDER
    90%

    View Slide

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

    View Slide

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

    View Slide

  20. Java, PHP and .NET ruled the
    dev world

    View Slide

  21. Lisps were out of
    fashion

    View Slide

  22. 2007

    View Slide

  23. A gentleman
    &
    a scholar

    View Slide

  24. Clojure

    View Slide

  25. Biggest Clojure problem at
    launch?

    View Slide

  26. 0 Clojure dev environments

    View Slide

  27. Emacs was the last Lisp
    stronghold

    View Slide

  28. SLIME

    View Slide

  29. Superior
    Lisp
    Interaction
    Mode for
    Emacs

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  33. 2008

    View Slide

  34. clojure-mode
    &
    swank-clojure

    View Slide

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

    View Slide

  36. A star was born

    View Slide

  37. 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

  38. SLIME is a
    Common Lisp
    tool

    View Slide

  39. 2010

    View Slide

  40. Another esteemed
    gentleman
    &
    scholar

    View Slide

  41. nREPL

    View Slide

  42. A common foundation
    for Clojure dev tools

    View Slide

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

    View Slide

  44. Extensible via middleware

    View Slide

  45. 2012

    View Slide

  46. nrepl.el

    View Slide

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

    View Slide

  48. A workhorse is retired

    View Slide

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

    View Slide

  50. 2013

    View Slide

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

    View Slide

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

    View Slide

  53. View Slide

  54. Clojure
    Integrated
    Development
    Environment &
    REPL

    View Slide

  55. Clojure
    Interactive
    Development
    Environment
    Reimagined

    View Slide

  56. CIDER
    (Emacs Lisp)
    nREPL
    (Clojure)
    cider-nrepl

    View Slide

  57. (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

  58. (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

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

    View Slide

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

    View Slide

  61. Bonus features

    View Slide

  62. Javadoc support

    View Slide

  63. JavaDoc Support

    View Slide

  64. C-c C-d d

    View Slide

  65. View Slide

  66. Jump to Java definition

    View Slide

  67. JavaDoc Support

    View Slide

  68. M-.

    View Slide

  69. View Slide

  70. Jump to resource

    View Slide

  71. View Slide

  72. C-c M-.

    View Slide

  73. resources/conj/demo/resource.txt

    View Slide

  74. Sanity-preserving stacktraces

    View Slide

  75. View Slide

  76. View Slide

  77. View Slide

  78. clojure.test integration

    View Slide

  79. C-c ,

    View Slide

  80. View Slide

  81. View Slide

  82. Namespace Browser

    View Slide

  83. View Slide

  84. Classpath browser

    View Slide

  85. View Slide

  86. Grimoire integration

    View Slide

  87. View Slide

  88. C-c C-d g

    View Slide

  89. View Slide

  90. • nREPL session manager
    • Smart ns reloading
    • ClojureScript support

    View Slide

  91. Extensions
    (are easy)

    View Slide

  92. • refactoring (clj-refactor + refactor-nrepl)
    • profiling (cider-profile + nrepl-refactor)
    • session tracking (cider-spy + cider-spy-nrepl)

    View Slide

  93. CIDER
    tastes better than
    SLIME

    View Slide

  94. What’s still missing?

    View Slide

  95. • Debugger
    • Find usages
    • A proper manual
    CIDER 1.0

    View Slide

  96. Why CIDER?

    View Slide

  97. IDE

    View Slide

  98. View Slide

  99. Emacs

    View Slide

  100. View Slide

  101. View Slide

  102. View Slide

  103. View Slide

  104. View Slide

  105. Emacs users
    know how to build productive Lisp
    workflows

    View Slide

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

    View Slide

  107. • paredit
    • smartparens
    • rainbow-delimiters
    • rainbow-identifiers
    • sexp-fu
    • paxedit

    View Slide

  108. Community impact

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  113. profile
    https://github.com/thunknyc/profile

    View Slide

  114. nREPL improvements

    View Slide

  115. Open development

    View Slide

  116. View Slide

  117. View Slide

  118. 85 contributors!

    View Slide

  119. Please, send more help!

    View Slide

  120. One more thing…

    View Slide

  121. CIDER 0.8 is out!

    View Slide

  122. Thanks!

    View Slide

  123. CIDER Demo / Q & A Unsession
    today @ 7 pm

    View Slide

  124. Felina

    View Slide