C# und F#

Ich habe mir ernsthaft überlegt ob ich etwas zu C# und/ oder F# hier veröffentlichen soll.

Unter Linux lade ich mir den C#-Compiler "mcs" mittels Synaptic bzw. apt-get.
Ich kann nun meinen Code in einen Editor meiner Wahl schreiben:

using System;
public class hello
{
public static void Main()
{
Console.WriteLine("Hallo C# Welt!");
}
}

Ich speichere den Code als hallo.cs und gebe folgendes in meine Konsole ein:

% mcs hallo.cs

% mono hallo.exe

Es erscheint:

Hallo C# Welt!

Ein weiteres kleines Beispiel zum Interagieren mit dem User:
(Ich habe hier extra "Console.Write" geschrieben, damit die Eingabe in der selben Zeile gemacht werden kann!)

using System;
class Program
{
static void Main(string[] args)
{
Console.Write("Wie ist Ihr Name? ");
string s = Console.ReadLine();
Console.WriteLine("Hallo, " +s+ "!");
}
}

Aber aufgepaßt! "ConsoleReadLine" ließt immer eine Zeichenkette - einen "string" - ein. Will man z.B. das Alter des Users einlesen
muß der "string" zu einem "integer" konvertiert werden um Fehlermeldungen zu vermeiden.

int alter = Convert.ToInt32(Console.ReadLine());

Ein weiteres Beispiel diesmal zu Thema Variablen und Variablen Substitution:

using System;
public class newyork
{
static void Main()
{
string city = "New York";
string name = "Paul"; int age = 35;
string nationality = "Amerikaner";
string output;
Console.WriteLine("In "+ city+ " ist er aufgewachsen.");
Console.WriteLine("Sein Name ist  " +name);
Console.WriteLine("Er ist "+age +" Jahre alt.");
Console.WriteLine("Er ist gebürtiger "+nationality);
city = "London";
Console.WriteLine("Zur Zeit lebt er in "+city);
output = string.Format("{0} ist {1} Jahre alt.", name, age);
Console.WriteLine(output);
}
}

Wir deklarieren hier vier Variable im string Format sowie eine als Integer. Danach weisen wir der Variablen "city" einen neuen Wert zu.
Wir benutzen ferner die Format() Methode der built-in Klasse. {0} und {1} sind die Plätze an denen die Variablen evaluiert werden.
Die Nummern in den geschweiften Klammern symbolisieren die Reihenfolgen in der die Argumente ( hier name und age ) zugestellt werden.

Die Entwicklungsumgebung Mono-Develop kann ich leider nicht für Debian-basierende Systeme empfehlen.
Läuft meiner Meinung nach nicht besonders stabil.

Gut, C# und F# sind eigentlich ausschliesslich für Visual Studio (.NET) entwickelt worden. Einzige, vernünftige, Alternative ist, für mich, allenfalls SharpDevelop, das aber auch nur unter Windows läuft.
Einfach hier http://www.icsharpcode.net/OpenSource/SD/Download/ herunter laden und installieren. Dabei darauf achten, dass man sich vorher das Windows SDK und das Net Framework bei Microsoft besorgt. (Entsprechende Links sind auf der SharpDevelop-Seite gesetzt).

Dann lädt man den F# Standalone-Compiler (http://msdn.microsoft.com/de-de/fsharp/default%28en-us%29.aspx), und SharpDevelop bindet den Compiler automatisch ein.

Oder, man besorgt sich unter selbiger Adresse die Trial-Version von Visual Studio 2010 Professional bei der F# integriert ist. Leider gibt es F# nicht in der kostenlosen Express Edition!

Unter Linux funktioniert der Compiler leider nicht mehr so wie er z.B. bei Ubuntuuser beschrieben wird.
Er bringt mittlerweile ein Installationsskript mit, welches bei mir aber zu einer Reihe von Fehlermeldungen geführt hat.

Da F# stark an OCaML angelehnt ist, besorgt man sich am Besten den OCaML Compiler aus seinen Repositories und übt damit ein wenig.

Ich kann nun wieder beginnen indem ich kleine Rechenoperationen ausführen lasse:

> 2+2;;
val it : int = 4
> 2*2;;
val it : int = 4
>
2/2;;
val it : int = 1
>

> let square x = x * x;;
val square : int -> int
> square 7;;
val it : int = 49
>

> let average x y = (x+y) /2;;
val average : int -> int -> int
> average 21 63;;
val it : int = 42
>


Versucht mal folgendes Code Beispiel in der Interactive Console:

> let country = "Deutschland";;
val country : string = "Deutschland"
> printfn "Hallo %s" country;;

zurück kommt:

>Hallo Deutschland
val it : unit = ()

Hier jetzt noch einmal das Beispiel zur Multiplikation von Array-Elementen:

> let rec mul3 xs = match xs with [] -> [] | y :: ys -> 3*y :: mul3 ys;;

val mul3 : int list -> int list

>
mul3 [1; 2; 3];;
val it : int list = [3; 6; 9]
>

Als Nächstes eine kleine Spielerei mit Listen. Ich starte wieder den Compiler:

debian% FSharp-2.0.0.0/bin/fsi.exe

Microsoft (R) F# 2.0 Interactive build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.

For help type #help;;

>
let t = ("gerd", 65000)
- let mann = fst t
- let einkommen = snd t
- printfn " %s verdient %i euro im jahr" mann einkommen;;

 gerd verdient 65000 euro im jahr

val t : string * int = ("gerd", 65000)
val mann : string = "gerd"
val einkommen : int = 65000

Ich habe hier eine Liste mit einem String und einem Integer deklariert. Ich weise den ersten Wert (fst=first) dem Namen "mann", und "einkommen" den zweiten Wert (snd=second) der Liste zu (wobei die Namen frei wählbar sind!). %s ist Platzhalter für einen String und %i für einen Integer, die ich mir, zusammen mit reinem Text ausgeben lasse.

Mit #quit;; schliesse ich den Compiler wieder.
Falls man einmal die zwei ;; vergessen sollte (was durchaus vorkommen kann), springt der Cursor in die nächste Zeile und man kann es dort nachholen.