Coffeescript. Javascript the good parts

Ähnliche Dokumente
Erwin Grüner

Übersicht Programmablaufsteuerung

5. Tutorium zu Programmieren

C/C++ Programmierung

Graphic Coding. Klausur. 9. Februar Kurs A

C# 2000 Expression Beispielcodes für Konsolen- und Formularanwendung

Objektorientierte Programmierung

Algorithmen und Datenstrukturen

Einführung Datentypen Verzweigung Schleifen Funktionen Dynamische Datenstrukturen. Java Crashkurs. Kim-Manuel Klein

Zählen von Objekten einer bestimmten Klasse

Ich liebe Java && Ich liebe C# Rolf Borst

Modellierung und Programmierung 1

Java 7. Elmar Fuchs Grundlagen Programmierung. 1. Ausgabe, Dezember 2011 JAV7

Programmieren. 10. Tutorium 4./ 5. Übungsblatt Referenzen

Einrichten einer mehrsprachigen Webseite mit Joomla (3.3.6)

PHP Code Konventionen Um einen einheitlichen Code zu generieren, der von jedem gelesen werden kann, müssen folgende Konventionen eingehalten werden.

Client-Server-Beziehungen

Programmieren in Haskell Einführung

Luis Kornblueh. May 22, 2014

Grundlagen der Programmierung Prof. H. Mössenböck. 3. Verzweigungen

Informatik Grundlagen, WS04, Seminar 13

Gebundene Typparameter

Grundlagen der Programmierung Prof. H. Mössenböck. 14. Schrittweise Verfeinerung

Tutorium Rechnerorganisation

Übungen Programmieren 1 Felix Rohrer. Übungen

Einführung in die Programmierung

Erweiterung der Aufgabe. Die Notenberechnung soll nicht nur für einen Schüler, sondern für bis zu 35 Schüler gehen:

C++ Tutorial: Timer 1

Algorithmen mit Python

Fachgebiet Informationssysteme Prof. Dr.-Ing. N. Fuhr. Programmierung Prof. Dr.-Ing. Nobert Fuhr. Übungsblatt Nr. 6

Java: Vererbung. Teil 3: super()

Gierhardt. 1 import javakara. JavaKaraProgram ; 3 public class Playit1 extends JavaKaraProgram. 4 { // Anfang von Playit1. 6 void gehezumbaum ( ) 7 {

Einführung in die Programmierung

Modul 122 VBA Scribt.docx

Das Typsystem von Scala. L. Piepmeyer: Funktionale Programmierung - Das Typsystem von Scala

Klausur in Programmieren

E-PRIME TUTORIUM Die Programmiersprache BASIC

Studentische Lösung zum Übungsblatt Nr. 7

Objektorientiertes JavaScript

Einführung in Javadoc

Datenbanken 1. Einführung und Zugänge für die eingesetzten Resourcen. ISWeb - Information Systems & Semantic Web University of Koblenz Landau, Germany


Scala kann auch faul sein

Linux Prinzipien und Programmierung

Kontrollstrukturen und Funktionen in C

Diana Lange. Generative Gestaltung Operatoren

Dokumentation für Popup (lightbox)

Entwurf von Algorithmen - Kontrollstrukturen

Javakurs 2013 Objektorientierung

Wiederholung und Vertiefung. Programmieren in C. Pointer und so... thoto. /dev/tal e.v. 6. April 2013 (Version vom 11. April 2013) Programmieren in C

Behandeln Sie»undefined«als»nicht vorhanden«thema 54

Objektorientierte Programmierung

Programmierung 2. Übersetzer: Code-Erzeugung. Sebastian Hack. Klaas Boesche. Sommersemester

Programmieren I. Kontrollstrukturen. Heusch 8 Ratz Institut für Angewandte Informatik

Einführung in Java. PING e.v. Weiterbildung Andreas Rossbacher 24. März 2005

Zusammenfassung des Handzettels für Programmieren in C

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck

5.4 Klassen und Objekte

Deklarationen in C. Prof. Dr. Margarita Esponda

Objektorientierung: Klassen und Objekte

Große Übung Praktische Informatik 1

Dr. Monika Meiler. Inhalt

Enterprise Feedback Suite

Name: Klausur Programmierkonzepte SS 2011

Programmierkurs Java

Delegatesund Ereignisse

Einführung in die Programmierung für Wirtschaftsinformatik

Einfache Ausdrücke Datentypen Rekursive funktionale Sprache Franz Wotawa Institut für Softwaretechnologie

Einfache Arrays. Annabelle Klarl. Einführung in die Informatik Programmierung und Softwareentwicklung

Datentypen. Agenda für heute, 4. März, Pascal ist eine streng typisierte Programmiersprache

Bitte wenden. Name: KURSARBEIT NR. 4 (10 DIFF GA) Seite 1

Java Einführung Abstrakte Klassen und Interfaces

Grundlagen von Python

WPF Steuerelemente Listbox, ComboBox, ListView,

Fallunterscheidung: if-statement

Schritt 1 - Ein Spielfeld

Visual Basic Basisbefehle Hinweis: Der Text in eckigen Klammern [ ] ist variabel, z.b. [var] => 5.3. Eckige Klammern sind stets wegzulassen!

4. Lernen von Entscheidungsbäumen. Klassifikation mit Entscheidungsbäumen. Entscheidungsbaum

Java-Schulung Grundlagen

Anleitung über den Umgang mit Schildern

Arge Betriebsinformatik GmbH & Co.KG, CAP News 40, Februar CAP-News 40

Hello World. Javakurs 2014, 1. Vorlesung. Sebastian Schuck. basierend auf der Vorlage von Arne Kappen. wiki.freitagsrunde.org. 3.

Neue Features in C# 2.0

Programmierung in C. Grundlagen. Stefan Kallerhoff

In vergleichsbasierten Suchbäumen wird nicht in Schlüssel hineingeschaut.

Javadoc. Programmiermethodik. Eva Zangerle Universität Innsbruck

Lua Grundlagen Einführung in die Lua Programmiersprache

Einführung in die Java- Programmierung

Einführung in das Programmieren Prolog Sommersemester Teil 2: Arithmetik. Version 1.0

TypeScript JavaScript mit ohne Kopfschmerzen. Veit Weber 3. JUG Saxony Day Radebeul

Handbuch. Artologik EZ-Equip. Plug-in für EZbooking version 3.2. Artisan Global Software

DataTables LDAP Service usage Guide

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung Grundlagen der Programmierung. Übung 05: Arrays. Abgabetermin: xx.xx.xxxx. Java-Programm Testplan Testergebnisse

Java-Programmierung mit NetBeans

Transkript:

Coffeescript Javascript the good parts

Sebastian Deutsch http://9elements.com Follow me on Twitter: http://twitter.com/sippndipp sebastian.deutsch@9elemtents.com

Wenn ich JAVA höre,

dann sehe ich...

Als ich angefangen habe, wollte ich aber eher so sein...

Be a Rebel Jede Kultur hat ihre Rebellen Jede Kultur hat ihr Imperium

...die Seiten wechseln ist nicht schlimm

Am JavaScript Day bin ich der CoffeeScript Rebel

Was ist CoffeeScript CoffeeScript ist ein Präprozessor für JS Alternative Syntax Forciert expressiven Code

Was ist CoffeeScript CoffeeScript ist Compiler Nutzt Jison Als Node.js Utility verfügbar

Getting started npm install coffee-script brew install coffee-script coffee --version

Zutaten

Significant Whitespace Kulturschock: Blöcke = Indentation Alles sind Expressions Das letzte evaluierte Objekt wird zurückgegeben

Beispiel JavaScript var cube, square; square = function(x) { return x * x; }; cube = function(x) { return square(x) * x; };

Beispiel JavaScript square = function(x) return x * x cube = function(x) return square(x) * x Implizite Deklaration von Variablen Keine Klammern, keine Semikolons

Beispiel JavaScript square = (x) -> x * x cube = (x) -> square(x) * x Funktion Keyword durch -> ersetzen Der letze evaluierte Wert wird zurückgegeben

CoffeScript...

...entfernt visuellen Lärm

OK Was noch?

Variablen CoffeeScript: number = 42 opposite = true alpha = ["a","b","c"] bitlist = [ 1, 0, 1 ] 0, 0, 1 1, 1, 0 JavaScript: var alpha, bitlist, number, opposite; number = 42; opposite = true; alpha = ["a", "b", "c"]; bitlist = [1, 0, 1, 0, 0, 1, 1, 1, 0];

Kontrollstrukturen number = -42 if opposite number = 1337 unless no_hacker if happy and knowsit claps_hands() do cha_cha_cha else show_it() Bedingungen können wie in Ruby eingesetzt werden

Switch switch day when "mon" then go "work" when "tue" then go "relax" when "thu" then go "ice fishing" when "fri", sat if "day" is "bingo_day" go "bingo" go "dancing" when "sun" then go "church" else go "work" go ist eine Funktion, Klammern müssen nicht sein

Try/Catch try all_hell_breaks_loose() cats_and_dogs_living_together() catch error console.log error finally clean_up() go ist eine Funktion, Klammern müssen nicht sein

Objekte (Hashes) singers = { Jagger: "Rock", Elvis: "Roll" } # YML style kids = brother: name: "Max" age: 11 sister: name: "Ida" age: 9

Schleifen CoffeeScript: goods = [ bread, 'wine'] eat food for food in goods JavaScript: var food, goods, _i, _len; goods = [ bread, 'wine']; for (_i = 0, _len = goods.length; _i < _len; _i++) { } food = goods[_i]; eat(food); Array Komprehension ist implizit, Schleifen sind Expressions

While/Until CoffeeScript: if this.studying_economics buy() while supply > demand sell() until supply > demand JavaScript: if (this.studying_economics) { while (supply > demand) { buy(); } while ((supply > demand)) { } } sell();

Spice

Array Comprehension for roid in asteroids for roid2 in asteroids when roid isnt roid2 roid.explode() if roid.overlaps roid2

Array Comprehension var roid, roid2, _i, _j, _len, _len2; for (_i = 0, _len = asteroids.length; _i < _len; _i++) { roid = asteroids[_i]; for (_j = 0, _len2 = asteroids.length; _j < _len2; _j++) { roid2 = asteroids[_j]; if (roid == roid2) { if (roid.overlaps(roid2)) { roid.explode(); } } } } 3 Zeilen vs. 12 Zeilen ;-)

Classes class Animal constructor: (@name) -> move: (meters) -> alert @name + " moved " + meters + "m." class Snake extends Animal move: -> alert "Slithering..." super 5 class Horse extends Animal move: -> alert "Galloping..." super 45 sam = new Snake "Sammy the Python" tom = new Horse "Tommy the Palomino" sam.move() tom.move()

Classes: Behind the Scenes extend function Prototypische Vererbung Jedes Objekt hat ein super Attribut

Classes: Behind the Scenes @ shortcut für this Innerhalb von Funktionen = Instanzvariablen Innerhalb von Hashes = statische Variablen

Open Classes Coffeescript: String::dasherize = -> @replace /_/g, - Javascript: String.prototype.dasherize = function() { return this.replace(/_/g, - ); };

Fat Arrow Coffeescript: Account = (customer, cart) -> @customer = customer @cart = cart $('.shopping_cart').bind 'click', (event) => @customer.purchase @cart

Fat Arrow Javascript: var Account; var bind = function(fn, me) { return function(){ return fn.apply(me, arguments); }; }; Account = function(customer, cart) { this.customer = customer(this.cart = cart); return $('.shopping_cart').bind('click', bind(function(event) { return this.customer.purchase(this.cart); }, this)); };

String Interpolation author = "Wittgenstein quote = "A picture is a fact. -- #{author}" String Interpolation wie bei Ruby, kann auch eine Expression sein.

Splats Coffeescript: race = (winner, runners...) -> console.log winner, runners Javascript: race = function() { var runners, winner; winner = arguments[0], runners = 2 <= arguments.length? slice.call(arguments, 1) : []; return console.log(winner, runners); };

Existence Coffeescript: alert "I knew it" if elvis? speed?= 140 lottery.draw_winner()?.address?.zipcode Ähnlich wie der AndAnd Gem bei Ruby oder try in Rails.

Existence Javascript: var _ref, _ref2; if (typeof elvis = "undefined" && elvis == null) { alert("i knew it"); } typeof speed = "undefined" && speed == null? speed : speed = 140; if ((_ref = lottery.drawwinner()) = null) { if ((_ref2 = _ref.address) = null) { _ref2.zipcode; } }

Destructuring Assignemnt weatherreport = (location) -> [location, 26, Sonnig"] [city, temp, forecast] = weatherreport Frankfurt"

Aliase is compiles to === isnt compiles to == not compiles to and compiles to && or compiles to on, yes, true compile to true off, no, false compile to false @, this compile to this of compile to in

Chained Comparisons cholesterol = 127 healthy = 200 > cholesterol > 60 Bei Python ausgeliehen

/Stand back I know regular Expressions/

Extended RegExp # Interpolation sep = "[.\\/\\- ] dates = /\d+#{sep}\d+#{sep}\d+/g # Extended RegExp OPERATOR = /// ^ (?: [-=]> # function [-+*/%<>& ^?=]= # compound assign / compare >>>=? # zero-fill right shift ([-+:])\1 # doubles ([& <>])\2=? # logic / shift \?\. # soak access \.{2,3} # range or splat ) ///

Toolchain

Editor TextMate Bundle http://github.com/ jashkenas/coffeescript-tmbundle VIM http://github.com/ kchmck/vim-coffeescript Emacs http://github.com/ defunkt/coffee-mode IntelliJ IDEA http:// yeungda.github.com /coffeescript-idea/

Cakefile sys = require 'sys' fs = require 'fs' exec = require('child_process').exec spawn = require('child_process').spawn task 'watch', 'watches and compiles coffee', -> sys.print "Spawning coffee watcher" coffee = spawn 'coffee', ['-cw', '-o', 'lib', 'src'] coffee.stdout.on 'data', (data) -> sys.print data exec "growlnotify -m \"#{data}\" -t \"Cakefile\"" coffee.stderr.on 'data', (data) -> sys.print data exec "growlnotify -m \"#{data}\" -t \"Cakefile\""

Rails 3.1 macht Coffeescript zum Default

Rails 3.1 https://github.com/rails/rails/compare/ 9333ca7...23aa7da Love It... I wish I could be constructive, but CofffeScript makes me nerdrage.

Thank You

one more thing

We re hiring contact@9elements.com