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 ?
- Python, everyone.
- IronPython 2.7 and tools for Visual Studio 2010 has been released.
- We all known JavaScript, right!
Douglas Crockford Web site about JavaScript
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
- There are a lot of good concepts in Dynamic Languages
- JavaScript is everywhere
- Learn it
- C# is becoming more and more dynamic
- More API are going to using these new language Constructs.
- ASP.NET MVC, Web Matrix.
- C# 5 will have a REPL (Read, Eval, Print, Loop)
- C# 5 will have Eval() method (this should not be good)
- More API are going to using these new language Constructs.
- 2 Urls:
I have no words for this great post such a awe-some information i got gathered. Thanks to Author.
ReplyDeleteVee Eee Technologies| Vee Eee Technologies|
Nice post.Keep sharing. Thanks for sharing.
ReplyDeleteFor all kind of astrological services contact Best Astrologer in Basavanagudi.
Nice Posting Thanks For Sharing.
ReplyDeleteVisit Vashikaran Astrologer in Canacona.
Thanks for sharing your information...It's very useful for many users...I will be waiting for your next post.
ReplyDeleteFor German uPVC windows in Bangalore. Contact us.
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