You are on page 1of 74

Nemerle is notable

Nemerle is notable
Denis Rystsov twitter.com/rystsov rystsov.denis@gmail.com 2011

Nemerle is notable

Origin

Nemerle is notable

Nemerle Experience

Nemerle is notable

Environment
Managed compiler written in Nemerle Visual Studio 2008 plugin with debugger and autocomplete Free IDE based on Visual Studio Isolated Shell Sharpdevelop plugin Mono support NAnt plugin

Nemerle is notable

Why not try?

Nemerle is almost a superset of C#, so if you know C# you can use Nemerle.

Nemerle is notable

Why not try?

By the way, Nemerle's compiler can compile C# code, so you can try it on exising C# project

Nemerle is notable

Why not try?

Why not try?

Nemerle is notable

Part I - use your C# habits

Part I - use your C# habits

Nemerle is notable

Hello world / C#

Nemerle is notable

Hello world / Nemerle

Nemerle is notable

Extension Methods / C#

Nemerle is notable

Extension Methods / Nemerle

Nemerle is notable

LINQ / C#

Nemerle is notable

LINQ / Nemerle

Nemerle is notable

Object Initialization / C#

Nemerle is notable

Object Initialization / Nemerle

Nemerle is notable

Anonymous Types / C#

Nemerle is notable

Anonymous Types / Nemerle

Nemerle is notable

Yield return / C#

Nemerle is notable

Yield return / Nemerle

Nemerle is notable

Dynamic / C#

Nemerle is notable

Dynamic / Nemerle

Nemerle is notable

Type casting / C#

Nemerle is notable

Type casting / Nemerle

Nemerle is notable

Try..Catch / C#

Nemerle is notable

Try..Catch / Nemerle

Nemerle is notable

Partial / C#

Nemerle is notable

Partial / Nemerle

Nemerle is notable

Arrays / C#

Nemerle is notable

Arrays / Nemerle

Nemerle is notable

Attention! Wild dinosaur!

Nemerle is notable

Goto?

What is about..

GOTO?
unlike C# Nemerle doesn't support it, but..

Nemerle is notable

The proper use of goto

The only one legal usage of goto is exit from nested loops
Nemerle provides a better solution  named code blocks

Nemerle is notable

Named code blocks

Nemerle is notable

Beyond C#

After this short intro you can write apps in Nemerle in C# style. But Nemerle goes far beyond it

Nemerle is notable

Desired C# features

It supports the most desired features of the next versions of C# right now

Nemerle is notable

Part II - desired C# features

Part II - desired C# features

Nemerle is notable

Object initializers with events

Nemerle is notable

Painless XML generation

Nemerle is notable

INotifyPropertyChanged language support

Nemerle is notable

`Safe navigation' operator

Nemerle is notable

Design by contract

Nemerle is notable

Sequence initialization (list comprehension)

Nemerle is notable

Yield from lambda

Nemerle is notable

Improved lazy support

Nemerle is notable

Part III  functional programming

Part III  functional programming (FP)

Nemerle is notable

What is FP?

Typical signs of FP
Monads Type inference Pattern matching Algebraic data types Built-in tuple support Local (nested) functions

Nemerle is notable

Nemerle supports FP

Nemerle supports it all

Nemerle is notable

Type inference

Nemerle is notable

Local functions

Nemerle is notable

Built-in tuple support

Nemerle is notable

Monads Monad is creational functional programming design pattern that deals with computation creation. The upcoming C# 5 async/await feature is particular case of a monad (creation of asynchronous computation). Computation expressions are monads + monoids. Nemerle supports computation expressions.

Nemerle is notable

Monads

Consequently Nemerle supports the upcoming C# 5 async/await feature right now among the other monads.

Nemerle is notable

Example of easy composition of two async methods

Nemerle is notable

Algebraic data types

Short intro to algebraic data types

Nemerle is notable

Algebraic data types

Let's learn ADT by example Suppose we need to work with expressions like
a + sin(b)

Nemerle is notable

Algebraic data type

Of couse we need trees

Nemerle is notable

OOP approach to trees (class hierarchy)

Nemerle is notable

FP approach to trees (ADT - algebraic data type)

Nemerle is notable

Algebraic data type  semantic

After we rewrite OOP code with variant (ADT) we should consider `Sum' as a constructor of type `Tree' `l',`r' as its params (not a Tree.Sum's elds) But if they are params, how get them back from a `Tree' typed object?

Nemerle is notable

Algebraic data type  Disassembling (pattern matching)

Pattern matching solves this problem. It checks if object is constructed with constructor specied in a pattern and if it is true it binds actual parameters of constructor with names of variables the pattern. Let's see on the following example.

Nemerle is notable

Pretty Printing of `Tree' typed object

Nemerle is notable

Algebraic data type  OOP vs. FP OOP

72 SLoC (pretty printing with visitor pattern)
FP

25 SLoC (pretty printing with pattern matching)

Nemerle is notable

Variant is OOP enabled algebraic data type

Nemerle is notable

Pattern matching goes beyond disassembling

Pattern matching can be nested.

Nemerle is notable

Almost all features are macros

Nemerle seems to be complex, but. . .

Nemerle is notable

Almost all Nemerle features are macros

Don't worry
Nemerle is a simple language and almost all features are macros  parts of standard library, not a language. Macros is a plugin to compiler. You can write your own macros to introduce new language constructs or eDSL.

Nemerle is notable

Almost all Nemerle features are macros

You've already meet macros in this presentation, they are. . .

Nemerle is notable

Almost all Nemerle features are macros

LINQ Object initialization Anonymous types Late (dynamic) XML-Literals INotifyPropertyChanged macro Safe navigation Design by contract Computation expressions Lazy macro and even if while foreach

Nemerle is notable

Advanced macros Beside macros copying useful features from another languages there are macros adding unique features. One of them is Nemerle.Peg. It is a macro-library that allows to describe grammar in the attribute and during the compilation necessary methods for parsing text in this grammar will be added to the class. Also there are some macros supporting design patterns.

Nemerle is notable

Nemerle is cool

Nemerle is cool. It was proved.

Nemerle is notable

Metric

Some metric of using Nemerle in home pet long-term research project uniquation.com formula search engine

Nemerle is notable

Metric

Two years ago rst prototype was rewritten from C# to Nemerle in 3 days. Nemerle experience before 0. Code was reduced by 46%. Last month a new macro library (Nemerle.Peg) was applyed. Code was reduced by 15%.

Nemerle is notable

Additional materials

Nemerle on google code Nemerle site Sources code of examples shown in this presentation