Saturday, June 4, 2011

What Can We Learn From Python And JavaScript While Programming in C#

What can we learn from


Python and JavaScript


while programming in C# 4.0?


























Introduction


Who I am?




First Name: Frederic
Last Name:  Torres
Web Site:   http://www.FredericTorres.net
State:      Massachusett






  • I have been writing code since MS-DOS 2.0 on different continents.
  • I write code in C# by day and in Python or JavaScript by night.























What about you ?





Alt text























Why am I here?




Dynamic Languages - Python, Ruby, JavaScript.


    - Source Code Length

    - Readability























Python and Ruby


  • The Pythonic way (Python Secret Weblog)
  • Ruby is designed to make programmers happy






















Peter Norvig from Google wrote a spell checker in 21 lines in Python How to Write a Spelling Corrector

import re, collections

def words(text): return re.findall('[a-z]+', text.lower()) 

def train(features):
    model = collections.defaultdict(lambda: 1)
    for f in features:
        model[f] += 1
    return model

NWORDS = train(words(file('big.txt').read()))

alphabet = 'abcdefghijklmnopqrstuvwxyz'

def edits1(word):
   splits     = [(word[:i], word[i:]) for i in range(len(word) + 1)]
   deletes    = [a + b[1:] for a, b in splits if b]
   transposes = [a + b[1] + b[0] + b[2:] for a, b in splits if len(b)>1]
   replaces   = [a + c + b[1:] for a, b in splits for c in alphabet if b]
   inserts    = [a + c + b     for a, b in splits for c in alphabet]
   return set(deletes + transposes + replaces + inserts)

def known_edits2(word):
    return set(e2 for e1 in edits1(word) for e2 in edits1(e1) if e2 in NWORDS)

def known(words): return set(w for w in words if w in NWORDS)

def correct(word):
    candidates = known([word]) or known(edits1(word)) or known_edits2(word) or [word]
    return max(candidates, key=NWORDS.get)























  • Is there anything we can learn from programming Python and JavaScript and apply it in C#?

    • This is the question I have been thinking about.
    • And it is not just me!























A different way to code in C#




  • Is there a different way to write code in C# in the air?
  • 3 Samples





  • ASP.NET MVC Syntax (Microsoft Product)

routes.MapRoute(
   "Default", // Route name
   "{controller}/{action}/{id}", // URL with parameters
   new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
);























  • Massive and Dapper : 2 small ORMs

    • Written in less than 400 lines of code each
    • Written by Rob Conery and Sam Saffron (from Stack Overflow)
    • Have been talked about on the hanselminutes podcast.

// Massive Syntax
var table = new Products();
table.Update( new { ProductName = "Chicken Fingers" } , 12);

var resultSet1 = persons.All(columns: "*", where: "ID >= @0", args: 1);
foreach(var p in resultSet1)
    Console.WriteLine(String.Format("ID:{0}, Name:{1}, {2}", p.ID, p.LastName, p.FirstName));                

//

  • The Dapper library and reflection.























  • Web Matrix (Microsoft Product)

























How did I got involve in this




  • The more experienced with Dynamic Languages, the more you will miss their syntaxes working in C#.
  • Is there anything that we can do with?

    • Reflection
    • Generics
    • Anonymous types
    • Extension method
    • Lambda expression/statment
    • The keyword params
    • The keyword dynamic and the class DynamicObject























DynamicSugar.Net


  • http://www.DynamicSugar.Net

    • A library providing methods and classes inspired by the dynamic languages Python and JavaScript
    • To write shorter and more readable source code in C# 4.0
    • On GitHub.com
    • On NuGet.org





It's all about Syntactic sugar.























Let's Start...


What can we learn about formatting string from JavaScript?




In C#


var firstName = "Fred";

Console.WriteLine(String.Format("Hello {0}",firstName));























In JavaScript


In JavaScript you may find this, which is not standard, but generally implemented via extension methods.

var firstName = "Fred";

print(String.format("Hello {0}",firstName));

print("Hello {0}".format(firstName));

print("Hello {firstName}".format( { firstName:"Fred" } ));

- Demo























What can we learn about formatting string from Python?




class Person(object):

  def __init__(self, name, age):
    self.Name = name
    self.Age  = age

  def Format(self, myFormat):
      return myFormat.format(**self.__dict__)

#######################################

p = Person("Fred", 45)
print p.Format("Name={Name}, Age={Age}")

- Demo























Object Literals [ ]


























Python's List


i = 3

if i in [1,3,5]:
    print "in the list"























JavaScript's Array


This code is not standard JavaScript. The method Contains() and In() are
defined before this code as extension methods.

var i = 3;

if([1,3,5].Contains(i))
    console.log("in the list")

if(i.In([1,3,5]))
    console.log("in the list")

- Demo























What about a function returning multiple values?


























What Python's syntax can say about that?


def ComputeValues(value):
    return True, 2.0*value, "Hello"

ok, amount, message = ComputeValues(2)

print ok:{0}, amount:{1}, message:{2}".format(ok, amount, message)























More about this


def ComputeValues(value):
    return True, 2.0*value, "Hello"

ok, amount, message = ComputeValues(2)

print "ok:%s, amount:%s, message:%s" % (ok, amount, message)


values = ComputeValues(2)

print "ok:%s, amount:%s, message:%s" % (values[0], values[1], values[2])
























What JavaScript's syntax can say about that?


function ComputeValues(value) {

    return { ok:true, amount:2.0*value, message:"Hello" };
}

var r = ComputeValues(2);

print("ok:"             + r.ok);
print("amount:"         + r.amount);
print("message:"        + r.message);







- Demo























Object Literals { }




  • Passing a populated dictionary to a function very common in Dynamic Languages.
  • In Python and Ruby, there is a dedicated syntax just to do that.

This allow to pass an unlimited number of argument in very clear way, by defining the name and the value of each argument.

  • JavaScript - an Ajax call with jQuery.

$.ajax( 
    {
        type    : "POST",
        url     : "some.php",
        data    : "name=John&location=Boston",
        success : function(msg){ alert( "Data Saved: " + msg ); }
    }
);























  • Python

def MyFunction(**context):

    if context["debug"]:
        print "Debug on"

    if "America" in context["continent"]:
        print context["continent"]

MyFunction( debug=True,  continent="North America" )
MyFunction( debug=True,  continent="South America" )
MyFunction( debug=False, continent="Europe"        )























With C# 4.0

  • Named parameters allow a similar syntax,
  • The number of arguments is limited and have to be predefined.

void MyFunction(bool debug, string continent){
  // code
}

MyFunction(false, "Europe");

MyFunction(debug:false, continent:"Europe");








- Demo























Conclusion




5 comments:

  1. I have no words for this great post such a awe-some information i got gathered. Thanks to Author.
    Vee Eee Technologies| Vee Eee Technologies|

    ReplyDelete
  2. Nice post.Keep sharing. Thanks for sharing.
    For all kind of astrological services contact Best Astrologer in Basavanagudi.

    ReplyDelete
  3. Thanks for sharing your information...It's very useful for many users...I will be waiting for your next post.
    For German uPVC windows in Bangalore. Contact us.

    ReplyDelete
  4. Amazing blog....Thank you for the very good and meaningful blog. It is very helpful for all blog writers. In this article, you define how to start a blog you also defined what is the right way to choose the right way for the topic. if you want to write a new blog you have a great opportunity to write a blog on the new topic of Server hosting. You Should write on USA Dedicated Server it offers an amazing hosting solution to users.

    ReplyDelete