agosto 2006 Blog Posts
Posto anche come promemoria... L'ultimo filmato su Channel9 è l'intervista ad un personaggio veramente singolare: Brian Beckman.Altrettanto interessante è il suo blog.
Ancora un esperimento con gli extension method...
public static class Monad{ public static Converter<List<A>, List<T>> Map<A, T>(this Converter<A, T> mapper) { return list => list.ConvertAll<T>(mapper); }}
Map è un extension method che data in input una funzione del tipo A -> T (dove A è il tipo del parametro di input e T il tipo del valore di ritorno), ritorna una funzione del tipo List<A> -> List<T>. In sostanza restituisce una nuova funzione che effettua la medesima trasformazione anzichè su un elemento, su una intera lista di elementi. Un esempio di codice che usa il metodo potrebbe essere:
List<string> list = new List<string>...
C# 3.0 introduce una interessante feature denominata extension method (vedi C# 3.0 Specification per maggiori dettagli) che in sostanza permette di "agganciare" metodi a qualunque tipo senza dover creare una classe derivata. Il tutto senza penalizzazioni in termini di performance visto che il lavoro è svolto a tempo di compilazione.Supponiamo ad es. di voler mettere a disposizione di ogni oggetto un metodo Serialize che effettua la serializzazione dello stesso utilizzando System.Xml.Serialization.XmlSerializer. Potremmo scrivere un extension method del tipo:
using System;using System.Collections.Generic;using System.Text;using System.IO;using System.Xml.Serialization;
namespace System.Xml.Serialization{ public static class SerializationExtensions { public static void Serialize(this object obj, TextWriter writer) { XmlSerializer s =...
Una considerazione banale ma dagli interessanti risvolti... Visto che le feature di C# 3.0 (extension method, lambda expression, object and collection initializer, ...) sono frutto dell'intelligente lavoro del compilatore e non di una nuova versione del CLR (il codice gira sul CLR 2.0), è possibile sviluppare codice C# 3.0, compilarlo con il compilatore Microsoft ed eseguirlo con il runtime Mono... anche su Linux, Mac OS X, ...
Stimolato da Lawrence (http://blogs.ugidotnet.org/lawrence/), nei ritagli di tempo (quali?!), mi sono messo a guardare un po' più seriamente Python e in particolare la sua (più nota) implementazione .Net: IronPython (http://www.codeplex.com/Wiki/View.aspx?ProjectName=IronPython).Sto pensando a come rendere "scriptabile" una applicazione che ho scritto poco tempo fa. In particolare volevo dare un'occhio di riguardo a Python come linguaggio per scriptarla. Un esempio semplice di codice... :
using System;using System.Collections.Generic;using System.Text;using System.IO;using IronPython.Hosting;
class Program{ static void Main(string[] args) { string[] colors = { "Red", "Green", "Blue" };
PythonEngine engine = new PythonEngine(); engine.Globals.Add("colors", colors);
using (FileStream stream = new FileStream(@"E:\temp\Python.out.txt", FileMode.OpenOrCreate)) { engine.SetStandardOutput(stream); engine.Execute("print colors[1:]"); } }}
Interessanti...