SlideShare a Scribd company logo
WHY LEARN NEW
PROGRAMMING LANGUAGES?

What I’ve learned from Ruby and Scheme that
applies to my daily work in C# and JavaScript




               Trondheim XP Meetup
  Jonas Follesø, Scientist/Manager BEKK Trondheim
                   08/02/2012
Why learn new programming languages
3
PERSONAL HISTORY OF PROGRAMMING LANGUAGES                                4




                 QBasic             Turbo Pascal    Delphi    VBScript
                  (1996)               (1998)        (1999)    (2001)




   C#      JavaScript      Java        Python      Scheme      Ruby
  (2002)     (2003)        (2004)       (2005)      (2006)     (2010)
PERSONAL HISTORY OF PROGRAMMING LANGUAGES                                5




                 QBasic             Turbo Pascal    Delphi    VBScript
                  (1996)               (1998)        (1999)    (2001)




   C#      JavaScript      Java        Python      Scheme      Ruby
  (2002)     (2003)        (2004)       (2005)      (2006)     (2010)
HIGHER ORDER FUNCTIONS                 6




       Formulating Abstractions with
          Higher-Order Functions
ABSTRACTIONS THROUGH FUNCTIONS   7




(* 3 3 3) ; outputs 27

(define (cube x)
  (* x x x))

(cube 3) ; outputs 27
ABSTRACTIONS THROUGH FUNCTIONS               8




(define (sum-int a b)
  (if (> a b)
      0
      (+ a (sum-int (+ a 1) b))))


(define (sum-cubes a b)
  (if (> a b)
      0
      (+ (cube a) (sum-cubes (+ a 1) b))))
ABSTRACTIONS THROUGH FUNCTIONS               9




(define (sum-int a b)
  (if (> a b)
      0
      (+ a (sum-int (+ a 1) b))))


(define (sum-cubes a b)
  (if (> a b)
      0
      (+ (cube a) (sum-cubes (+ a 1) b))))
ABSTRACTIONS THROUGH FUNCTIONS             10




(define (<name> a b)
  (if (> a b)
      0
      (+ <term> (<name> (<next> a) b))))
ABSTRACTIONS THROUGH FUNCTIONS                    11




(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a) (sum term (next a) next b))))

(define (inc n) (+ n 1))
(define (identity n) n)

(define (sum-int a b) (sum identity a inc b))
(define (sum-cubes a b) (sum cube a inc b))

(sum-int 0 10) ; outputs 55
(sum-cubes 0 10) ; outputs 3025
ABSTRACTIONS THROUGH FUNCTIONS                    12




(define (sum term a next b)
  (if (> a b)
      0
      (+ (term a) (sum term (next a) next b))))

(define (inc n) (+ n 1))
(define (identity n) n)

(define (sum-int a b) (sum identity a inc b))
(define (sum-cubes a b) (sum cube a inc b))

(sum-int 0 10) ; outputs 55
(sum-cubes 0 10) ; outputs 3025
ABSTRACTIONS THROUGH FUNCTIONS - JAVASCRIPT   13




$("li").click(function() {
    $(this).css({'color':'yellow'});
});

$("li").filter(function(index) {
    return index % 3 == 2;
}).css({'color':'red'});

$.get("/some-content", function(data) {
    // update page with data...
});
ABSTRACTIONS THROUGH FUNCTIONS – C#                    14




SumEvenCubes(1, 10); // outputs 1800

public int SumEvenCubes() {
    var num = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    return num
             .Where(IsEven)
             .Select(Cube)
             .Aggregate(Sum);
}

public bool IsEven(int n) { return n % 2 == 0; }
public int Cube(int n) { return n*n*n; }
public int Sum(int a, int b) { return a + b; }
OBJECTS FROM CLOSURES                 15




             You don’t need classes
               to create objects
OBJECTS FROM CLOSURES IN SCHEME             16


(define (make-account balance)

  (define (withdraw amount)
    (if (>= balance amount)
        (set! balance (- balance amount))
        "Insufficient funds"))

  (define (deposit amount)
    (set! balance (+ balance amount))
    balance)

  (define (dispatch m . args)
    (case m
      ((withdraw) (apply withdraw args))
      ((deposit) (apply deposit args))))

  dispatch)

(define account1 (make-account 100))
(account1 'withdraw 50)
(account1 'deposit 25) ; outputs 75
OBJECTS FROM CLOSURES IN JAVASCRIPT                 17


var make_account = function (balance) {
    var withdraw = function (amount) {
        if (balance >= amount) balance -= amount;
        else throw "Insufficient funds";
        return balance;
    };
    var deposit = function (amount) {
        balance += amount;
        return balance;
    };
    return {
        withdraw: withdraw,
        deposit: deposit
    };
};

var account1 = make_account(100);
account1.withdraw(50);
account1.deposit(25); // outputs 75
READABILITY                       18




              Extreme emphasis
              on expressiveness
READABILITY                                   19




 “[…] we need to focus on humans, on how
 humans care about doing programming or
 operating the application of the machines.
 We are the masters. They are the slaves…”
EXAMPLES OF RUBY IDIOMS          20




abort unless str.include? "OK"

x = x * 2 until x > 100

3.times { puts "olleh" }

10.days_ago
2.minutes + 30.seconds

1.upto(100) do |i|
  puts i
end
EXAMPLE OF RSPEC TEST                        21




describe Bowling do
    it "should score 0 for gutter game" do
        bowling = Bowling.new
        20.times { bowling.hit(0) }
        bowling.score.should == 0
    end
end
C# UNIT TEST INFLUENCED BY RSPEC                          22



public class Bowling_specs {
    public void Should_score_0_for_gutter_game() {
        var bowling = new Bowling();
        20.Times(() => bowling.Hit(0));
        bowling.Score.Should().Be(0);
    }
}

public static class IntExtensions {
    public static void Times(this int times, Action action) {
        for (int i = 0; i <= times; ++i)
            action();
    }
}
C# FLUENT ASSERTIONS                                             23



string actual = "ABCDEFGHI";

actual.Should().StartWith("AB")
               .And.EndWith("HI")
               .And.Contain("EF")
               .And.HaveLength(9);

IEnumerable collection = new[] { 1, 2, 3 };
collection.Should().HaveCount(4, "we put three items in collection"))
collection.Should().Contain(i => i > 0);
READABILITY                        24




              Internal DSLs and
               Fluent Interfaces
RUBY DSL EXAMPLES - MARKABY   25
RUBY DSL EXAMPLES – ENUMERABLE PROXY API   26
C# LINQ EXAMPLE                                               27


static void Main(string[] args)
{
    var people = new[] {
        new Person { Age=28, Name   =   "Jonas Follesø"},
        new Person { Age=25, Name   =   "Per Persen"},
        new Person { Age=55, Name   =   "Ole Hansen"},
        new Person { Age=40, Name   =   "Arne Asbjørnsen"},
    };

    var old = from p in people
              where p.Age > 25
              orderby p.Name ascending
              select p;

    foreach(var p in old) Console.WriteLine(p.Name);
}

---
Arne Asbjørnsen
Jonas Follesø
Ole Hansen
C# STORYQ EXAMPLE                                            28


[Test]
public void Gutter_game()
{
    new Story("Score calculation")
        .InOrderTo("Know my performance")
        .AsA("Player")
        .IWant("The system to calculate my total score")
            .WithScenario("Gutter game")
                .Given(ANewBowlingGame)
                .When(AllOfMyBallsAreLandingInTheGutter)
                .Then(MyTotalScoreShouldBe, 0)
            .WithScenario("All strikes")
                .Given(ANewBowlingGame)
                .When(AllOfMyBallsAreStrikes)
                .Then(MyTotalScoreShouldBe, 300)
        .ExecuteWithReport(MethodBase.GetCurrentMethod());
}
C# OBJECT BUILDER PATTERN                                           29


[Test]
public void Should_generate_shipping_statement_for_order()
{
    Order order = Build
                    .AnOrder()
                    .ForCustomer(Build.ACustomer())
                    .WithLine("Some product", quantity: 1)
                    .WithLine("Some other product", quantity: 2);

    var orderProcessing = new OrderProcessing();
    orderProcessing.ProcessOrder(order);
}
MONKEY PATCHING                       30




         Runtime generation of code
              and behaviour
RUBY ACTIVE RECORD AND METHOD MISSING   31
C# DYNAMIC AND EXPANDO OBJECT                                  32


static void Main(string[] args)
{
    dynamic person = new ExpandoObject();
    person.Name = "Jonas Follesø";
    person.Age = 28;

    Console.WriteLine("{0} ({1})", person.Name, person.Age);
}

Jonas Follesø (28)
C# MONKEY PATCHING                                                  33


public class DynamicRequest : DynamicObject
{
    public override bool TryGetMember(GetMemberBinder binder,
                                               out object result)
    {
        string key = binder.Name;
        result = HttpContext.Current.Request[key] ?? "";
        return true;
    }
}

@using MvcApplication1.Controllers
@{
    Page.Request = new DynamicRequest();
}

<h4>Hello @Page.Request.Name</h4>
<h4>Hello @HttpContext.Current.Request["Name"]</h4>
C# MICRO ORMS                                                34




• Afrer C# 4.0 with support for dynamic typing a whole new
  category of micro ORMs has emerged:

 • Massive
 • Simple.Data
 • Peta Pico
 • Dapper
C# MICRO ORMS                                                       35




IEnumerable<User> u = db.Users.FindAllByName("Bob").Cast<User>();


db.Users.FindByNameAndPassword(name, password)
// SELECT * FROM Users WHERE Name = @p1 and Password = @p2


db.Users.FindAllByJoinDate("2010-01-01".to("2010-12-31"))
// SELECT * FROM [Users] WHERE [Users].[JoinDate] <= @p1
SAPIR–WHORF HYPOTHESIS                                                 36




 The principle of linguistic relativity holds that
 the structure of a language affects the ways in
 which its speakers are able to conceptualize their
 world, i.e. their world view.

                  http://en.wikipedia.org/wiki/Linguistic_relativity
37




TAKK FOR MEG

   Jonas Follesø

More Related Content

What's hot (20)

PDF
The Ring programming language version 1.6 book - Part 183 of 189
Mahmoud Samir Fayed
 
PDF
C Code and the Art of Obfuscation
guest9006ab
 
PDF
Что нам готовит грядущий C#7?
Andrey Akinshin
 
PDF
Python opcodes
alexgolec
 
DOCX
Advance java
Vivek Kumar Sinha
 
PDF
Cbse question paper class_xii_paper_2000
Deepak Singh
 
PDF
Modular Module Systems
league
 
PDF
Metaprogramming
Dmitri Nesteruk
 
PDF
Dynamic C++ ACCU 2013
aleks-f
 
PDF
The Ring programming language version 1.3 book - Part 83 of 88
Mahmoud Samir Fayed
 
PPSX
C# 6.0 - April 2014 preview
Paulo Morgado
 
PDF
C++ TUTORIAL 4
Farhan Ab Rahman
 
PDF
The Ring programming language version 1.9 book - Part 38 of 210
Mahmoud Samir Fayed
 
DOCX
Computer Graphics Lab File C Programs
Kandarp Tiwari
 
DOCX
Cg my own programs
Amit Kapoor
 
PDF
Container adapters
mohamed sikander
 
PDF
The Ring programming language version 1.8 book - Part 73 of 202
Mahmoud Samir Fayed
 
PPT
OOP v3
Sunil OS
 
PPTX
Class list data structure
Katang Isip
 
PDF
C# v8 new features - raimundas banevicius
Raimundas Banevičius
 
The Ring programming language version 1.6 book - Part 183 of 189
Mahmoud Samir Fayed
 
C Code and the Art of Obfuscation
guest9006ab
 
Что нам готовит грядущий C#7?
Andrey Akinshin
 
Python opcodes
alexgolec
 
Advance java
Vivek Kumar Sinha
 
Cbse question paper class_xii_paper_2000
Deepak Singh
 
Modular Module Systems
league
 
Metaprogramming
Dmitri Nesteruk
 
Dynamic C++ ACCU 2013
aleks-f
 
The Ring programming language version 1.3 book - Part 83 of 88
Mahmoud Samir Fayed
 
C# 6.0 - April 2014 preview
Paulo Morgado
 
C++ TUTORIAL 4
Farhan Ab Rahman
 
The Ring programming language version 1.9 book - Part 38 of 210
Mahmoud Samir Fayed
 
Computer Graphics Lab File C Programs
Kandarp Tiwari
 
Cg my own programs
Amit Kapoor
 
Container adapters
mohamed sikander
 
The Ring programming language version 1.8 book - Part 73 of 202
Mahmoud Samir Fayed
 
OOP v3
Sunil OS
 
Class list data structure
Katang Isip
 
C# v8 new features - raimundas banevicius
Raimundas Banevičius
 

Viewers also liked (9)

PPTX
Introduction to MonoTouch
Jonas Follesø
 
PPTX
Hvordan lage en vellykket WP7 applikasjon
Jonas Follesø
 
PPT
Hvordan lage en vellykket Windows Phone 7 App
Jonas Follesø
 
PPTX
Smidig 2011 TDD Workshop
Jonas Follesø
 
PDF
BK2011 Trafikanten - Et webprosjekt med full oppgradering av karttjenester
Geodata AS
 
PPTX
An overview of the Windows Phone 7 platform
Jonas Follesø
 
PPTX
Smidig brukeropplevelse med skjermbildeprototyper (Smidig2009)
Jonas Follesø
 
PPTX
Get a flying start with Windows Phone 7 - NDC2010
Jonas Follesø
 
PPTX
Cross platform mobile apps using .NET
Jonas Follesø
 
Introduction to MonoTouch
Jonas Follesø
 
Hvordan lage en vellykket WP7 applikasjon
Jonas Follesø
 
Hvordan lage en vellykket Windows Phone 7 App
Jonas Follesø
 
Smidig 2011 TDD Workshop
Jonas Follesø
 
BK2011 Trafikanten - Et webprosjekt med full oppgradering av karttjenester
Geodata AS
 
An overview of the Windows Phone 7 platform
Jonas Follesø
 
Smidig brukeropplevelse med skjermbildeprototyper (Smidig2009)
Jonas Follesø
 
Get a flying start with Windows Phone 7 - NDC2010
Jonas Follesø
 
Cross platform mobile apps using .NET
Jonas Follesø
 
Ad

Similar to Why learn new programming languages (20)

PDF
Emerging Languages: A Tour of the Horizon
Alex Payne
 
PDF
Functional programming in ruby
Koen Handekyn
 
PPT
Trends in Programming Technology you might want to keep an eye on af Bent Tho...
InfinIT - Innovationsnetværket for it
 
DOC
10266 developing data access solutions with microsoft visual studio 2010
bestip
 
PPTX
Good functional programming is good programming
kenbot
 
PDF
Dynamic languages, for software craftmanship group
Reuven Lerner
 
PDF
JavaScript 1.5 to 2.0 (TomTom)
jeresig
 
KEY
Exciting JavaScript - Part II
Eugene Lazutkin
 
PDF
Ruby — An introduction
Gonçalo Silva
 
PDF
Ruby & Machine Vision - Talk at Sheffield Hallam University Feb 2009
Jan Wedekind
 
PPT
Understanding linq
Anand Kumar Rajana
 
PDF
Functional programming with F#
Remik Koczapski
 
PPTX
Introduction to Clojure and why it's hot for Sart-Ups
edlich
 
PDF
Groovy On Trading Desk (2010)
Jonathan Felch
 
PPTX
How To Code in C#
David Ringsell
 
PPTX
Tech Days Paris Intoduction F# and Collective Intelligence
Robert Pickering
 
PDF
[Ebooks PDF] download C How to Program 1ST Edition Harvey M. Deitel full chap...
raaenvalko0u
 
KEY
LISP: How I Learned To Stop Worrying And Love Parantheses
Dominic Graefen
 
PDF
A Sceptical Guide to Functional Programming
Garth Gilmour
 
PDF
The Future of JavaScript (Ajax Exp '07)
jeresig
 
Emerging Languages: A Tour of the Horizon
Alex Payne
 
Functional programming in ruby
Koen Handekyn
 
Trends in Programming Technology you might want to keep an eye on af Bent Tho...
InfinIT - Innovationsnetværket for it
 
10266 developing data access solutions with microsoft visual studio 2010
bestip
 
Good functional programming is good programming
kenbot
 
Dynamic languages, for software craftmanship group
Reuven Lerner
 
JavaScript 1.5 to 2.0 (TomTom)
jeresig
 
Exciting JavaScript - Part II
Eugene Lazutkin
 
Ruby — An introduction
Gonçalo Silva
 
Ruby & Machine Vision - Talk at Sheffield Hallam University Feb 2009
Jan Wedekind
 
Understanding linq
Anand Kumar Rajana
 
Functional programming with F#
Remik Koczapski
 
Introduction to Clojure and why it's hot for Sart-Ups
edlich
 
Groovy On Trading Desk (2010)
Jonathan Felch
 
How To Code in C#
David Ringsell
 
Tech Days Paris Intoduction F# and Collective Intelligence
Robert Pickering
 
[Ebooks PDF] download C How to Program 1ST Edition Harvey M. Deitel full chap...
raaenvalko0u
 
LISP: How I Learned To Stop Worrying And Love Parantheses
Dominic Graefen
 
A Sceptical Guide to Functional Programming
Garth Gilmour
 
The Future of JavaScript (Ajax Exp '07)
jeresig
 
Ad

More from Jonas Follesø (6)

PPTX
Introduction to F#
Jonas Follesø
 
PPTX
Windows Phone 7 lyntale fra Grensesnittet Desember 2010
Jonas Follesø
 
PPTX
NNUG Trondheim 30.09.2010 - Windows Phone 7
Jonas Follesø
 
PPTX
Generating characterization tests for legacy code
Jonas Follesø
 
PPTX
MVVM Design Pattern NDC2009
Jonas Follesø
 
PPT
Silverlight 2 for Developers - TechEd New Zealand 2008
Jonas Follesø
 
Introduction to F#
Jonas Follesø
 
Windows Phone 7 lyntale fra Grensesnittet Desember 2010
Jonas Follesø
 
NNUG Trondheim 30.09.2010 - Windows Phone 7
Jonas Follesø
 
Generating characterization tests for legacy code
Jonas Follesø
 
MVVM Design Pattern NDC2009
Jonas Follesø
 
Silverlight 2 for Developers - TechEd New Zealand 2008
Jonas Follesø
 

Recently uploaded (20)

PDF
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
PPTX
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
PDF
Java 25 and Beyond - A Roadmap of Innovations
Ana-Maria Mihalceanu
 
PDF
“Scaling i.MX Applications Processors’ Native Edge AI with Discrete AI Accele...
Edge AI and Vision Alliance
 
PDF
Open Source Milvus Vector Database v 2.6
Zilliz
 
PDF
How to Visualize the ​Spatio-Temporal Data Using CesiumJS​
SANGHEE SHIN
 
PDF
Kubernetes - Architecture & Components.pdf
geethak285
 
PPTX
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
PDF
Python Conference Singapore - 19 Jun 2025
ninefyi
 
PDF
Automating the Geo-Referencing of Historic Aerial Photography in Flanders
Safe Software
 
PDF
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
PPTX
𝙳𝚘𝚠𝚗𝚕𝚘𝚊𝚍—Wondershare Filmora Crack 14.0.7 + Key Download 2025
sebastian aliya
 
PDF
UiPath Agentic AI ile Akıllı Otomasyonun Yeni Çağı
UiPathCommunity
 
PPTX
Simplifica la seguridad en la nube y la detección de amenazas con FortiCNAPP
Cristian Garcia G.
 
PPTX
Smarter Governance with AI: What Every Board Needs to Know
OnBoard
 
PDF
Redefining Work in the Age of AI - What to expect? How to prepare? Why it mat...
Malinda Kapuruge
 
PPTX
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
PPTX
Paycifi - Programmable Trust_Breakfast_PPTXT
FinTech Belgium
 
PDF
Hello I'm "AI" Your New _________________
Dr. Tathagat Varma
 
2025_06_18 - OpenMetadata Community Meeting.pdf
OpenMetadata
 
Enabling the Digital Artisan – keynote at ICOCI 2025
Alan Dix
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Pitch ...
Michele Kryston
 
Java 25 and Beyond - A Roadmap of Innovations
Ana-Maria Mihalceanu
 
“Scaling i.MX Applications Processors’ Native Edge AI with Discrete AI Accele...
Edge AI and Vision Alliance
 
Open Source Milvus Vector Database v 2.6
Zilliz
 
How to Visualize the ​Spatio-Temporal Data Using CesiumJS​
SANGHEE SHIN
 
Kubernetes - Architecture & Components.pdf
geethak285
 
01_Approach Cyber- DORA Incident Management.pptx
FinTech Belgium
 
Python Conference Singapore - 19 Jun 2025
ninefyi
 
Automating the Geo-Referencing of Historic Aerial Photography in Flanders
Safe Software
 
Optimizing the trajectory of a wheel loader working in short loading cycles
Reno Filla
 
𝙳𝚘𝚠𝚗𝚕𝚘𝚊𝚍—Wondershare Filmora Crack 14.0.7 + Key Download 2025
sebastian aliya
 
UiPath Agentic AI ile Akıllı Otomasyonun Yeni Çağı
UiPathCommunity
 
Simplifica la seguridad en la nube y la detección de amenazas con FortiCNAPP
Cristian Garcia G.
 
Smarter Governance with AI: What Every Board Needs to Know
OnBoard
 
Redefining Work in the Age of AI - What to expect? How to prepare? Why it mat...
Malinda Kapuruge
 
MARTSIA: A Tool for Confidential Data Exchange via Public Blockchain - Poster...
Michele Kryston
 
Paycifi - Programmable Trust_Breakfast_PPTXT
FinTech Belgium
 
Hello I'm "AI" Your New _________________
Dr. Tathagat Varma
 

Why learn new programming languages

  • 1. WHY LEARN NEW PROGRAMMING LANGUAGES? What I’ve learned from Ruby and Scheme that applies to my daily work in C# and JavaScript Trondheim XP Meetup Jonas Follesø, Scientist/Manager BEKK Trondheim 08/02/2012
  • 3. 3
  • 4. PERSONAL HISTORY OF PROGRAMMING LANGUAGES 4 QBasic Turbo Pascal Delphi VBScript (1996) (1998) (1999) (2001) C# JavaScript Java Python Scheme Ruby (2002) (2003) (2004) (2005) (2006) (2010)
  • 5. PERSONAL HISTORY OF PROGRAMMING LANGUAGES 5 QBasic Turbo Pascal Delphi VBScript (1996) (1998) (1999) (2001) C# JavaScript Java Python Scheme Ruby (2002) (2003) (2004) (2005) (2006) (2010)
  • 6. HIGHER ORDER FUNCTIONS 6 Formulating Abstractions with Higher-Order Functions
  • 7. ABSTRACTIONS THROUGH FUNCTIONS 7 (* 3 3 3) ; outputs 27 (define (cube x) (* x x x)) (cube 3) ; outputs 27
  • 8. ABSTRACTIONS THROUGH FUNCTIONS 8 (define (sum-int a b) (if (> a b) 0 (+ a (sum-int (+ a 1) b)))) (define (sum-cubes a b) (if (> a b) 0 (+ (cube a) (sum-cubes (+ a 1) b))))
  • 9. ABSTRACTIONS THROUGH FUNCTIONS 9 (define (sum-int a b) (if (> a b) 0 (+ a (sum-int (+ a 1) b)))) (define (sum-cubes a b) (if (> a b) 0 (+ (cube a) (sum-cubes (+ a 1) b))))
  • 10. ABSTRACTIONS THROUGH FUNCTIONS 10 (define (<name> a b) (if (> a b) 0 (+ <term> (<name> (<next> a) b))))
  • 11. ABSTRACTIONS THROUGH FUNCTIONS 11 (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (inc n) (+ n 1)) (define (identity n) n) (define (sum-int a b) (sum identity a inc b)) (define (sum-cubes a b) (sum cube a inc b)) (sum-int 0 10) ; outputs 55 (sum-cubes 0 10) ; outputs 3025
  • 12. ABSTRACTIONS THROUGH FUNCTIONS 12 (define (sum term a next b) (if (> a b) 0 (+ (term a) (sum term (next a) next b)))) (define (inc n) (+ n 1)) (define (identity n) n) (define (sum-int a b) (sum identity a inc b)) (define (sum-cubes a b) (sum cube a inc b)) (sum-int 0 10) ; outputs 55 (sum-cubes 0 10) ; outputs 3025
  • 13. ABSTRACTIONS THROUGH FUNCTIONS - JAVASCRIPT 13 $("li").click(function() { $(this).css({'color':'yellow'}); }); $("li").filter(function(index) { return index % 3 == 2; }).css({'color':'red'}); $.get("/some-content", function(data) { // update page with data... });
  • 14. ABSTRACTIONS THROUGH FUNCTIONS – C# 14 SumEvenCubes(1, 10); // outputs 1800 public int SumEvenCubes() { var num = new[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; return num .Where(IsEven) .Select(Cube) .Aggregate(Sum); } public bool IsEven(int n) { return n % 2 == 0; } public int Cube(int n) { return n*n*n; } public int Sum(int a, int b) { return a + b; }
  • 15. OBJECTS FROM CLOSURES 15 You don’t need classes to create objects
  • 16. OBJECTS FROM CLOSURES IN SCHEME 16 (define (make-account balance) (define (withdraw amount) (if (>= balance amount) (set! balance (- balance amount)) "Insufficient funds")) (define (deposit amount) (set! balance (+ balance amount)) balance) (define (dispatch m . args) (case m ((withdraw) (apply withdraw args)) ((deposit) (apply deposit args)))) dispatch) (define account1 (make-account 100)) (account1 'withdraw 50) (account1 'deposit 25) ; outputs 75
  • 17. OBJECTS FROM CLOSURES IN JAVASCRIPT 17 var make_account = function (balance) { var withdraw = function (amount) { if (balance >= amount) balance -= amount; else throw "Insufficient funds"; return balance; }; var deposit = function (amount) { balance += amount; return balance; }; return { withdraw: withdraw, deposit: deposit }; }; var account1 = make_account(100); account1.withdraw(50); account1.deposit(25); // outputs 75
  • 18. READABILITY 18 Extreme emphasis on expressiveness
  • 19. READABILITY 19 “[…] we need to focus on humans, on how humans care about doing programming or operating the application of the machines. We are the masters. They are the slaves…”
  • 20. EXAMPLES OF RUBY IDIOMS 20 abort unless str.include? "OK" x = x * 2 until x > 100 3.times { puts "olleh" } 10.days_ago 2.minutes + 30.seconds 1.upto(100) do |i| puts i end
  • 21. EXAMPLE OF RSPEC TEST 21 describe Bowling do it "should score 0 for gutter game" do bowling = Bowling.new 20.times { bowling.hit(0) } bowling.score.should == 0 end end
  • 22. C# UNIT TEST INFLUENCED BY RSPEC 22 public class Bowling_specs { public void Should_score_0_for_gutter_game() { var bowling = new Bowling(); 20.Times(() => bowling.Hit(0)); bowling.Score.Should().Be(0); } } public static class IntExtensions { public static void Times(this int times, Action action) { for (int i = 0; i <= times; ++i) action(); } }
  • 23. C# FLUENT ASSERTIONS 23 string actual = "ABCDEFGHI"; actual.Should().StartWith("AB") .And.EndWith("HI") .And.Contain("EF") .And.HaveLength(9); IEnumerable collection = new[] { 1, 2, 3 }; collection.Should().HaveCount(4, "we put three items in collection")) collection.Should().Contain(i => i > 0);
  • 24. READABILITY 24 Internal DSLs and Fluent Interfaces
  • 25. RUBY DSL EXAMPLES - MARKABY 25
  • 26. RUBY DSL EXAMPLES – ENUMERABLE PROXY API 26
  • 27. C# LINQ EXAMPLE 27 static void Main(string[] args) { var people = new[] { new Person { Age=28, Name = "Jonas Follesø"}, new Person { Age=25, Name = "Per Persen"}, new Person { Age=55, Name = "Ole Hansen"}, new Person { Age=40, Name = "Arne Asbjørnsen"}, }; var old = from p in people where p.Age > 25 orderby p.Name ascending select p; foreach(var p in old) Console.WriteLine(p.Name); } --- Arne Asbjørnsen Jonas Follesø Ole Hansen
  • 28. C# STORYQ EXAMPLE 28 [Test] public void Gutter_game() { new Story("Score calculation") .InOrderTo("Know my performance") .AsA("Player") .IWant("The system to calculate my total score") .WithScenario("Gutter game") .Given(ANewBowlingGame) .When(AllOfMyBallsAreLandingInTheGutter) .Then(MyTotalScoreShouldBe, 0) .WithScenario("All strikes") .Given(ANewBowlingGame) .When(AllOfMyBallsAreStrikes) .Then(MyTotalScoreShouldBe, 300) .ExecuteWithReport(MethodBase.GetCurrentMethod()); }
  • 29. C# OBJECT BUILDER PATTERN 29 [Test] public void Should_generate_shipping_statement_for_order() { Order order = Build .AnOrder() .ForCustomer(Build.ACustomer()) .WithLine("Some product", quantity: 1) .WithLine("Some other product", quantity: 2); var orderProcessing = new OrderProcessing(); orderProcessing.ProcessOrder(order); }
  • 30. MONKEY PATCHING 30 Runtime generation of code and behaviour
  • 31. RUBY ACTIVE RECORD AND METHOD MISSING 31
  • 32. C# DYNAMIC AND EXPANDO OBJECT 32 static void Main(string[] args) { dynamic person = new ExpandoObject(); person.Name = "Jonas Follesø"; person.Age = 28; Console.WriteLine("{0} ({1})", person.Name, person.Age); } Jonas Follesø (28)
  • 33. C# MONKEY PATCHING 33 public class DynamicRequest : DynamicObject { public override bool TryGetMember(GetMemberBinder binder, out object result) { string key = binder.Name; result = HttpContext.Current.Request[key] ?? ""; return true; } } @using MvcApplication1.Controllers @{ Page.Request = new DynamicRequest(); } <h4>Hello @Page.Request.Name</h4> <h4>Hello @HttpContext.Current.Request["Name"]</h4>
  • 34. C# MICRO ORMS 34 • Afrer C# 4.0 with support for dynamic typing a whole new category of micro ORMs has emerged: • Massive • Simple.Data • Peta Pico • Dapper
  • 35. C# MICRO ORMS 35 IEnumerable<User> u = db.Users.FindAllByName("Bob").Cast<User>(); db.Users.FindByNameAndPassword(name, password) // SELECT * FROM Users WHERE Name = @p1 and Password = @p2 db.Users.FindAllByJoinDate("2010-01-01".to("2010-12-31")) // SELECT * FROM [Users] WHERE [Users].[JoinDate] <= @p1
  • 36. SAPIR–WHORF HYPOTHESIS 36 The principle of linguistic relativity holds that the structure of a language affects the ways in which its speakers are able to conceptualize their world, i.e. their world view. http://en.wikipedia.org/wiki/Linguistic_relativity
  • 37. 37 TAKK FOR MEG Jonas Follesø