Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Reading Clojure

Reading Clojure

If there's one thing that trips Clojure newcomers is how to read the damned thing.

Clojure's syntax is very simple, and yet newcomers to Clojure tend to project into the language the complexity of other languages they're used to. We'll go through a few Clojure examples and deconstruct them to show how there's even less syntax to it than you probably think.

Video: https://youtu.be/t_T5wtLyZos

Ricardo J. Méndez

September 13, 2017
Tweet

More Decks by Ricardo J. Méndez

Other Decks in Programming

Transcript

  1. Reading Clojure
    Ricardo J. Méndez
    [email protected]
    @ArgesRic

    https://mastodon.social/@ricardojmendez

    View Slide

  2. @ArgesRic
    This is about the thought
    process when evaluating things.

    View Slide

  3. @ArgesRic
    “What in the name of Cthulhu’s
    green tentacles did I commit to?”

    View Slide

  4. @ArgesRic
    Show of hands
    • Who here isn't programming in Clojure yet?
    • Who is kind of familiar with the language but still finding their
    footing?
    • Who considers themselves to be fully comfortable in it?

    View Slide

  5. @ArgesRic
    This one’s for the first two.

    View Slide

  6. @ArgesRic
    Learning stages
    • First we learn by reading;
    • Then we learn by imitating;
    • And finally, we learn by creating.

    View Slide

  7. @ArgesRic
    I bollocksed up the first two.

    View Slide

  8. @ArgesRic
    Clojure can be hard to read
    because of how simple it is.

    View Slide

  9. @ArgesRic
    Syntax is that part of the
    language that’s set in stone.

    View Slide

  10. @ArgesRic

    View Slide

  11. @ArgesRic
    Let’s describe how we see this.

    View Slide

  12. @ArgesRic

    View Slide

  13. @ArgesRic

    View Slide

  14. @ArgesRic
    Tokens are the wrong way of
    thinking about Clojure.

    View Slide

  15. @ArgesRic

    View Slide

  16. @ArgesRic
    So let’s dissect things a bit.

    View Slide

  17. @ArgesRic
    (1 2 3)

    [1 2 3]

    (+ 1 2 3)

    [+ 1 2 3]

    View Slide

  18. @ArgesRic
    Evaluation semantics

    View Slide

  19. @ArgesRic
    (+ 1 2 3)

    (1 2 3)

    View Slide

  20. @ArgesRic
    Trick question!

    View Slide

  21. @ArgesRic
    (+ 1 2 3)

    (1 2 3)

    View Slide

  22. @ArgesRic
    We can always quote a list.

    View Slide

  23. @ArgesRic
    If you’re joining us from
    Java… Or C#… 


    Or not-a-LISP...

    View Slide

  24. @ArgesRic
    “Yeah, yeah, homoiconicity, we
    get it”

    View Slide

  25. @ArgesRic
    *except all those special
    cases…

    View Slide

  26. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  27. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  28. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  29. @ArgesRic
    A special form aside…

    View Slide

  30. @ArgesRic
    “That’s the stuff that’s
    different!”

    View Slide

  31. @ArgesRic
    They aren’t special cases.
    They are primitives.

    View Slide

  32. @ArgesRic
    Primitives are so rare they are
    special.

    View Slide

  33. @ArgesRic
    Back to the if

    View Slide

  34. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  35. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  36. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  37. @ArgesRic
    (if odd?
    (do-something [1 3 5 7])
    (do-another-thing [0 2 4 6]))

    View Slide

  38. @ArgesRic
    “Branches, in parenthesis"

    View Slide

  39. @ArgesRic
    (if got-a-list?
    (convert-to-string [1 3 5 7])
    "Got something else")

    View Slide

  40. @ArgesRic
    We are always evaluating.
    Stop thinking on terms of
    “execution”.

    View Slide

  41. @ArgesRic
    Back to defn

    View Slide

  42. @ArgesRic
    (defn plus-one [v w]
    (+ w v 1))

    View Slide

  43. @ArgesRic
    (
    defn ; We are evaluating this
    plus-one
    [v w]
    (+ w v 1)
    )

    View Slide

  44. @ArgesRic
    (
    defn
    plus-one ; All these
    [v w] ; are
    (+ w v 1) ; parameters.
    )

    View Slide

  45. @ArgesRic
    (
    defn
    plus-one ; This is an identifier
    [v w]
    (+ w v 1)
    )

    View Slide

  46. @ArgesRic
    (
    defn
    plus-one
    [v w] ; This is a vector w/param ids
    (+ w v 1)
    )

    View Slide

  47. @ArgesRic
    (
    defn
    plus-one
    [v w]
    (+ w v 1) ; This is a list to evaluate
    )

    View Slide

  48. @ArgesRic
    (
    defn ; We are invoking this
    plus-one ; This is an identifier
    [v w] ; This is a vector w/param ids
    (+ w v 1) ; This is a list to evaluate
    )

    View Slide

  49. @ArgesRic
    (defn get-from-string
    [conn long-url]
    (let [url (db/get-url conn long-url)
    parsed (db/parse url)]
    (clean-up parsed)))

    View Slide

  50. @ArgesRic
    (
    defn
    get-from-string
    [conn long-url]
    (
    let
    [url (db/get-url conn long-url) parsed (db/parse url)]
    (clean-up parsed)
    )
    )

    View Slide

  51. @ArgesRic
    (
    defn
    get-from-string
    [conn long-url]
    (
    let
    [url (db/get-url conn long-url) parsed (db/parse url)]
    (clean-up parsed)
    )
    )

    View Slide

  52. @ArgesRic
    (
    defn
    get-from-string
    [conn long-url]
    (
    let
    [url (db/get-url conn long-url) parsed (db/parse url)]
    (clean-up parsed)
    )
    )

    View Slide

  53. @ArgesRic
    (
    defn
    get-from-string
    [conn long-url]
    (
    let
    [url (db/get-url conn long-url) parsed (db/parse url)]
    (clean-up parsed)
    )
    )

    View Slide

  54. @ArgesRic
    Everything will follow this exact
    same pattern.

    View Slide

  55. @ArgesRic
    The Tao of Clojure:
    There is nothing but the list.

    View Slide

  56. @ArgesRic
    Let’s break some stuff!

    View Slide

  57. @ArgesRic
    (inc)
    (inc 1)
    (inc inc)

    View Slide

  58. @ArgesRic
    inc
    [inc]
    [inc 1]
    [inc 1 inc]

    View Slide

  59. @ArgesRic
    (defn a-function [v]
    [+ 1 2 3 4 5]
    (plus-one 2 3)
    plus-one [inc]
    [inc 1]
    v)

    View Slide

  60. @ArgesRic
    (defn a-function [v]
    [+ 1 2 3 4 5]
    (plus-one 2 3)
    plus-one
    [inc]
    [inc 1]
    v)

    View Slide

  61. @ArgesRic
    Abusing the syntax to disabuse
    you of misconceptions.

    View Slide

  62. @ArgesRic
    #1: "Everything needs to be
    wrapped in parenthesis."
    #2: "There’s all these special
    cases."

    View Slide

  63. @ArgesRic
    (apply + [1 2 3 4])

    (get {+ 1 - 2 * 3} -)

    View Slide

  64. @ArgesRic
    … we’re about out of time

    View Slide

  65. @ArgesRic
    Thank you!
    Ricardo J. Méndez
    [email protected]
    @ArgesRic
    https://mastodon.social/@ricardojmendez
    https://numergent.com/talks/

    View Slide