Upload
spierre
View
2.447
Download
1
Embed Size (px)
Citation preview
Sugar :More sweetness for
programming languages
Sébastien Pierre, Datalicious@FreeHackers's Union Mtl, Mar. 2009
www.datalicious.ca | github.com/sebastien/sugar
1: The Origin
3
Much in common
Many languages
… Java, C#, Python, Ruby, JavaScript, ActionScript ....
have a lot in common
Primitive types : numbers, strings, arrays, etc.
Control structures : if, for, while, etc.
Constructs : functions, objects, modules, etc.
4
So what's the difference ?
Syntax, of course !
F (1) (Algolstyle)
(f 1) (Lispstyle)
[f withN:1] (Smalltalkstyle)
f 1← (Why not ?)
5
Syntax only ?
Well, we have traits*
Never change anything (Purely functional)
Everything is an object (Purely objectoriented)
Evaluate only when needed (Lazy evaluation)
Code as data (Homoiconic)
* we could actually call that “ language features”
6
Syntax, Traits, and ... ?
… the base library !
Lisp : lambda, car, cdr
C : libc, POSIX
JavaScript : ECMA standard library
Java : everything but the kitchen sink
7
The Idea
Considerations
Languages have a lot in common
But I keep rewriting the same code in different languages
I came to learn how I prefer to express myself
Ideally
I would like to write once, in my syntax of choice
And translate to the target language
8
However...
Languages are still “ black boxes”
Cannot change syntax easily
Difficult to access program representation
We think that the program is the source code, but...
The source code is one expression of the program
The program is a compound construct interpreted by a runtime system
9
So...
Let's do “ something*” that
Is a syntactic wrapper for other languages
Offers full program model representation
Translates to commonly used languages
Can be easily customized by mortals
* This would be a program that writes programs (metaprogram)
10
2: SugarA MetaProgramming
Language
11
It's all about syntax
And we can have the luxury to design it !
readability : visual cues, typographic rhythm
expressiveness : constructs to describe common patterns
consistency : many developers, same code
accessibility : learn it in a few hours
12
We can reuse a lot
We take advantage of
Languagespecific primitive types (lists, maps)
Languagespecific libraries (file, os, etc.)
And we provide
Abstraction over languagespecific traits
Emulation of nonsupported primitive types, constructs or operations
13
Design Goals
“ A program is a design expressed in code”
Goals
Be learned in a couple of hours
Put focus on software architecture
Encourage clear, readable code
Favor thinking over typing
14
Inspiration
Python : expressiveness and consistency
Eiffel : formalizing structure and dynamics
Smalltalk : objects and messagepassing
JavaScript : functions and objects having fun together !
And indirectly, Lisp, Io, Erlang and Scala.
15
The syntax : Primitive Types
Lists
[] [1,2,3] [“ a” , 2, [3, 4]]
Maps/objectsasmaps
{} {a:1, b:2} {name:” bob” , email:” [email protected]” }
And of course... numbers
1 1.0 0xFFAAD0
16
The syntax : Indexes and Slices
value [ start index : end index]
var list = [1,2,3,4,5,6,7,8,9]
list [0] 1 (first element)
list [1] 9 (last element)
list [:] [1,2,3,4,5,6,7,8,9] (list copy)
list [1:] [2,3,4,5,6,7,8,9] (copy after index 1)
list [:1] [1,2,3,4,5,6,7,8] (copy until last index)
17
The syntax : Iterators
The traditional “ for each in”
for value, index in [1,2,3,4]
print (value, index)
end
With objects too, one one line
for value, index in {a:1,b:2,c:3} > print (value, index)
And the compact form (with a closure)
[1,2,3,4] :: {v,k | print (v,k) }
18
The syntax : Closures
Closures as blocks
var hello = {message|
print (“ You said:” + message)
}
Compact syntax for callbacks (here using jQuery)
$ (“ .sayhello” ) click {alert (“ say hello” )}
19
The syntax : Idioms (1)
Spaces instead of dots
var user = {name:” bob” , email:” bob gmail.com” }
print (user name)
Why ?Less dense code / more whitespace
space denotes “ message sending”
dot denotes “ structural resolution” (ask me for details ;)
20
The syntax : Idioms (2)
Indentation instead of commas or semicolons
var user = {name:” bob” , email:” [email protected]” }
var user = {name : “ bob” no trailing comma here←
email : “ [email protected]”
}
Why ?Got too many errors for missing or extra trailing comma
21
The syntax : Idioms (3)
Optional parens in singleargument invocationsprint “ Hello, world !”
user addPoints 10
$ “ .sayhello” click {alert “ Hello” }
article setAuthor 'user single quote to denote singleargument←
Why ?A lot of invocations are single argument
22
The syntax: Constructs
Constructs start with @, body is indented@function name arg1, arg2,...rest
| Documentation string
...
@end
The flavors@module, @function
@class, @property, @shared, @constructor, @method, @operation
23
Under The Hood
Full program model API (LambdaFactory)
Constructs Program, Module, Class, Function, ...
Control Iteration, Selection, ...
Operations Computation, Evaluation, Resolution
Metaprogramming
Flexible plugin “ program pass” system:
Modify, manipulate, analyze your program
24
Plugin Languages
Multiple backends (provided by LambdaFactory)
JavaScript (production quality)
ActionScript (not so bad)
Python (mature, but missing some stuff)
Pnuts (for fast scripting on the JDK)
Multiple frontends
Sugar is just one of them !
25
3: What's In It for Me ?Sugar in practice
26
Why would I use Sugar ?
To replace JavaScript for front (or back) end Web dev :
simplified syntax fewer errors
simplified semantics less surprised
higher level constructs more structured code
easy to learn no excuse !
27
You will code like Douglas Crockford !
In JavaScriptrequestNumber = JSONRequest.post( "https://json.penzance.org/request", { user: "[email protected]", t: "vlIj", zip: 94089, forecast: 7 }, function (requestNumber, value, exception) { if (value) { processResponse(value); } else { processError(exception); } });
In Sugar (with mandatory indentation)var requestNumber = JSONRequest post ( "https://json.penzance.org/request" { user : "[email protected]" t : "vlIj" zip : 94089 forecast : 7 } {requestNumber, value, exception| if value processResponse(value) else processError(exception) end })
From Douglas Crockford : http://www.json.org/JSONRequest.html
28
Get started !
You'll need
Python 2.4+
And install these
git clone git://github.com/sebastien/lambdafactory.git
git clone git://github.com/sebastien/sugar.git