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

CoffeeScript @ Web Directions South 2011

jashkenas
October 18, 2011

CoffeeScript @ Web Directions South 2011

jashkenas

October 18, 2011
Tweet

More Decks by jashkenas

Other Decks in Programming

Transcript

  1. CoffeeScript

    View full-size slide

  2. “It’s just JavaScript”

    View full-size slide

  3. Under the Hood

    View full-size slide

  4. Scope.prototype.find = function(name, options) {
    if (this.check(name, options)) {
    return true;
    }
    this.add(name, 'var');
    return false;
    };

    View full-size slide

  5. Syntax + Semantics + Goodies
    var square = function(x) {
    return x * x;
    };

    View full-size slide

  6. # Functions...
    square = (x) -> x * x

    View full-size slide

  7. # Literals.
    stooges = ['Moe', 'Curly', 'Larry']
    elements = {
    hydrogen: 1,
    silicon: 14,
    uranium: 92
    }

    View full-size slide

  8. # Whitespace for blocks.
    today = "Monday"
    if today is "Monday"
    console.log "Strange Loop!"
    else
    console.log "Awww..."

    View full-size slide

  9. # Array, Range, and Object comprehensions.
    list = ['a', 'b', 'c']
    console.log "Hi " + letter for letter in list
    console.log("Hi " + letter for letter in list)
    for name of process
    console.log name
    for i in [0..10]
    console.log i

    View full-size slide

  10. # Even conditional statements.
    console.log if false
    100
    else
    200
    # Even crazy things like a try/catch.
    tryResult = try
    missing.object
    catch err
    "And the error is: #{err}"
    console.log tryResult

    View full-size slide

  11. bestActor = (winner, others...) ->
    console.log "And the Oscar goes to ... #{winner}!"
    console.log "(with #{others.length} runners up)"
    bestActor 'Gypo Nolan', 'Clark Gable',
    'Paul Muni', 'Ludwig Satz'

    View full-size slide

  12. # The existential operator.
    sue =
    name: 'Sue Jones'
    age: 27
    console.log sue.name.length
    console.log sue.non?.existent.property
    console.log sue.name.split('').reverse?()

    View full-size slide

  13. # Class literals.
    shanty = """
    Now let every man drink off his full bumper,
    And let every man drink off his full glass;
    We will drink and be jolly and drown melancholy,
    And heres to the health of each true-hearted lass.
    """
    class Mariner
    sing: -> console.log shanty
    class UptightSailor extends Mariner
    sing: -> console.log "I'd rather not."
    class Pirate extends Mariner
    sing: ->
    super()
    console.log 'AAAAARRRRRRRRRRRRR!'
    new Pirate().sing()

    View full-size slide

  14. class Person
    constructor: (@name) ->
    # body of constructor.
    introduce: =>
    console.log "Hi, I'm #{@name}."
    groucho = new Person "Groucho Marx"
    sayHi = groucho.introduce
    sayHi()

    View full-size slide

  15. futurists =
    sculptor: "Umberto Boccioni"
    painter: "Vladimir Burliuk"
    poet:
    name: "F.T. Marinetti"
    address: [
    "Via Roma 42R"
    "Bellagio, Italy 22021"
    ]
    {poet: {name: name, address: [street, city]}} = futurists
    console.log "#{name} lives on #{street}."

    View full-size slide

  16. # David's web server example:
    http = require 'http'
    server = http.createServer (req, res) ->
    res.writeHead 200, 'Content-Type': 'text/plain'
    res.end 'Ahoy, Strange Loop!'
    server.listen 3000
    console.log 'Listening on 3000'

    View full-size slide

  17. Design Decisions

    View full-size slide

  18. # Significant Whitespace
    if condition
    do action
    if condition then do action
    do action if condition
    # Other whitespace constructs, like try/catch.
    try
    thing
    catch error
    recover
    try thing catch error then recover

    View full-size slide

  19. # Bound vs. Unbound Functions.
    class Book
    save: ->
    jQuery.ajax this.url, this.data, (response) ->
    merge this.data, response.data
    # Why are unbound functions necessary in JavaScript?

    View full-size slide

  20. # Executable Classes
    class Pirate
    loot: ->
    say "Give me the gold!"
    # ... and with if/else.
    class Pirate
    if century > 1700
    loot: ->
    say "Give me the gold!"
    else
    loot: ->
    say "¡Dame el oro!"
    # ... and with wrapped functions.
    class Pirate
    loot: heartily ->
    say "Give me the gold!"

    View full-size slide

  21. # Comprehensions (a little bit of everything)
    for item in list
    process item
    for key, value of object
    process value
    # Own keys...
    for own key, value of object
    process value
    # Filtering keys and values.
    for num in list when num % 2 is 0
    even num
    # Value of a comprehension?

    View full-size slide

  22. Build Your Own
    JavaScript

    View full-size slide

  23. It’s OK to Cheat.

    View full-size slide

  24. OMeta
    Canopy
    JS/CC
    ReParse
    JSGLR
    Antlr
    Cruiser.Parse
    p4js
    jsparse

    View full-size slide