Tomas recently posted a terrific new tool called F# Web Snippets.  You can read a bit on his blog, but you can get an immediate feel right here:

open System
open System.Numerics

let maxIteration = 100

let modSquared (c : Complex) = c.Real * c.Real + c.Imaginary * c.Imaginary

type MandelbrotResult = 
    | DidNotEscape
    | Escaped of int
    
let mandelbrot c =
    let rec mandelbrotInner z iterations =
        if(modSquared z >= 4.0) 
            then Escaped iterations
        elif iterations = maxIteration
            then DidNotEscape
        else mandelbrotInner ((z * z) + c) (iterations + 1)
    mandelbrotInner c 0

let chars = " .:-;!/>)|&IH%*#"

for y in [-1.2..0.05..1.2] do
    for x in [-2.0..0.025..0.9] do
        match mandelbrot(Complex(x, y)) with
        | DidNotEscape -> Console.Write " "
        | Escaped i -> Console.Write chars.[i &&& 15]
    Console.WriteLine() F# Web Snippets
namespace System
namespace System.Numerics
val maxIteration : int

Full name: Untitled.maxIteration

  type: int
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<int>
  implements: IEquatable<int>
  inherits: ValueType
val modSquared : Complex -> float

Full name: Untitled.modSquared
val c : Complex

  type: Complex
  implements: IEquatable<Complex>
  implements: IFormattable
  inherits: ValueType
type Complex =
  struct
    new : float * float -> System.Numerics.Complex
    member Equals : obj -> bool
    member Equals : System.Numerics.Complex -> bool
    member GetHashCode : unit -> int
    member Imaginary : float
    member Magnitude : float
    member Phase : float
    member Real : float
    member ToString : unit -> string
    member ToString : string -> string
    member ToString : System.IFormatProvider -> string
    member ToString : string * System.IFormatProvider -> string
    static val Zero : System.Numerics.Complex
    static val One : System.Numerics.Complex
    static val ImaginaryOne : System.Numerics.Complex
    static member Abs : System.Numerics.Complex -> float
    static member Acos : System.Numerics.Complex -> System.Numerics.Complex
    static member Add : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
    static member Asin : System.Numerics.Complex -> System.Numerics.Complex
    static member Atan : System.Numerics.Complex -> System.Numerics.Complex
    static member Conjugate : System.Numerics.Complex -> System.Numerics.Complex
    static member Cos : System.Numerics.Complex -> System.Numerics.Complex
    static member Cosh : System.Numerics.Complex -> System.Numerics.Complex
    static member Divide : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
    static member Exp : System.Numerics.Complex -> System.Numerics.Complex
    static member FromPolarCoordinates : float * float -> System.Numerics.Complex
    static member Log : System.Numerics.Complex -> System.Numerics.Complex
    static member Log : System.Numerics.Complex * float -> System.Numerics.Complex
    static member Log10 : System.Numerics.Complex -> System.Numerics.Complex
    static member Multiply : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
    static member Negate : System.Numerics.Complex -> System.Numerics.Complex
    static member Pow : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
    static member Pow : System.Numerics.Complex * float -> System.Numerics.Complex
    static member Reciprocal : System.Numerics.Complex -> System.Numerics.Complex
    static member Sin : System.Numerics.Complex -> System.Numerics.Complex
    static member Sinh : System.Numerics.Complex -> System.Numerics.Complex
    static member Sqrt : System.Numerics.Complex -> System.Numerics.Complex
    static member Subtract : System.Numerics.Complex * System.Numerics.Complex -> System.Numerics.Complex
    static member Tan : System.Numerics.Complex -> System.Numerics.Complex
    static member Tanh : System.Numerics.Complex -> System.Numerics.Complex
  end

Full name: System.Numerics.Complex

  type: Complex
  implements: IEquatable<Complex>
  implements: IFormattable
  inherits: ValueType
property Complex.Real: float
property Complex.Imaginary: float
type MandelbrotResult =
  | DidNotEscape
  | Escaped of int

Full name: Untitled.MandelbrotResult

  type: MandelbrotResult
  implements: IEquatable<MandelbrotResult>
  implements: Collections.IStructuralEquatable
  implements: IComparable<MandelbrotResult>
  implements: IComparable
  implements: Collections.IStructuralComparable
union case MandelbrotResult.DidNotEscape: MandelbrotResult
union case MandelbrotResult.Escaped: int -> MandelbrotResult
Multiple items
val int : 'T -> int (requires member op_Explicit)

Full name: Microsoft.FSharp.Core.Operators.int

--------------------

type int<'Measure> = int

Full name: Microsoft.FSharp.Core.int<_>

  type: int<'Measure>
  implements: IComparable
  implements: IConvertible
  implements: IFormattable
  implements: IComparable<int<'Measure>>
  implements: IEquatable<int<'Measure>>
  inherits: ValueType


--------------------

type int = int32

Full name: Microsoft.FSharp.Core.int

  type: int
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<int>
  implements: IEquatable<int>
  inherits: ValueType
val mandelbrot : Complex -> MandelbrotResult

Full name: Untitled.mandelbrot
val mandelbrotInner : (Complex -> int -> MandelbrotResult)
val z : Complex

  type: Complex
  implements: IEquatable<Complex>
  implements: IFormattable
  inherits: ValueType
val iterations : int

  type: int
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<int>
  implements: IEquatable<int>
  inherits: ValueType
val chars : string

Full name: Untitled.chars

  type: string
  implements: IComparable
  implements: ICloneable
  implements: IConvertible
  implements: IComparable<string>
  implements: seq<char>
  implements: Collections.IEnumerable
  implements: IEquatable<string>
val y : float

  type: float
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<float>
  implements: IEquatable<float>
  inherits: ValueType
val x : float

  type: float
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<float>
  implements: IEquatable<float>
  inherits: ValueType
type Console =
  class
    static member BackgroundColor : System.ConsoleColor with get, set
    static member Beep : unit -> unit
    static member Beep : int * int -> unit
    static member BufferHeight : int with get, set
    static member BufferWidth : int with get, set
    static member CapsLock : bool
    static member Clear : unit -> unit
    static member CursorLeft : int with get, set
    static member CursorSize : int with get, set
    static member CursorTop : int with get, set
    static member CursorVisible : bool with get, set
    static member Error : System.IO.TextWriter
    static member ForegroundColor : System.ConsoleColor with get, set
    static member In : System.IO.TextReader
    static member InputEncoding : System.Text.Encoding with get, set
    static member KeyAvailable : bool
    static member LargestWindowHeight : int
    static member LargestWindowWidth : int
    static member MoveBufferArea : int * int * int * int * int * int -> unit
    static member MoveBufferArea : int * int * int * int * int * int * char * System.ConsoleColor * System.ConsoleColor -> unit
    static member NumberLock : bool
    static member OpenStandardError : unit -> System.IO.Stream
    static member OpenStandardError : int -> System.IO.Stream
    static member OpenStandardInput : unit -> System.IO.Stream
    static member OpenStandardInput : int -> System.IO.Stream
    static member OpenStandardOutput : unit -> System.IO.Stream
    static member OpenStandardOutput : int -> System.IO.Stream
    static member Out : System.IO.TextWriter
    static member OutputEncoding : System.Text.Encoding with get, set
    static member Read : unit -> int
    static member ReadKey : unit -> System.ConsoleKeyInfo
    static member ReadKey : bool -> System.ConsoleKeyInfo
    static member ReadLine : unit -> string
    static member ResetColor : unit -> unit
    static member SetBufferSize : int * int -> unit
    static member SetCursorPosition : int * int -> unit
    static member SetError : System.IO.TextWriter -> unit
    static member SetIn : System.IO.TextReader -> unit
    static member SetOut : System.IO.TextWriter -> unit
    static member SetWindowPosition : int * int -> unit
    static member SetWindowSize : int * int -> unit
    static member Title : string with get, set
    static member TreatControlCAsInput : bool with get, set
    static member WindowHeight : int with get, set
    static member WindowLeft : int with get, set
    static member WindowTop : int with get, set
    static member WindowWidth : int with get, set
    static member Write : bool -> unit
    static member Write : char -> unit
    static member Write : char [] -> unit
    static member Write : float -> unit
    static member Write : decimal -> unit
    static member Write : float32 -> unit
    static member Write : int -> unit
    static member Write : uint32 -> unit
    static member Write : int64 -> unit
    static member Write : uint64 -> unit
    static member Write : obj -> unit
    static member Write : string -> unit
    static member Write : string * obj -> unit
    static member Write : string * obj [] -> unit
    static member Write : string * obj * obj -> unit
    static member Write : char [] * int * int -> unit
    static member Write : string * obj * obj * obj -> unit
    static member Write : string * obj * obj * obj * obj -> unit
    static member WriteLine : unit -> unit
    static member WriteLine : bool -> unit
    static member WriteLine : char -> unit
    static member WriteLine : char [] -> unit
    static member WriteLine : decimal -> unit
    static member WriteLine : float -> unit
    static member WriteLine : float32 -> unit
    static member WriteLine : int -> unit
    static member WriteLine : uint32 -> unit
    static member WriteLine : int64 -> unit
    static member WriteLine : uint64 -> unit
    static member WriteLine : obj -> unit
    static member WriteLine : string -> unit
    static member WriteLine : string * obj -> unit
    static member WriteLine : string * obj [] -> unit
    static member WriteLine : char [] * int * int -> unit
    static member WriteLine : string * obj * obj -> unit
    static member WriteLine : string * obj * obj * obj -> unit
    static member WriteLine : string * obj * obj * obj * obj -> unit
  end

Full name: System.Console
Multiple overloads
Console.Write(value: string) : unit
Console.Write(value: obj) : unit
Console.Write(value: uint64) : unit
Console.Write(value: int64) : unit
Console.Write(value: uint32) : unit
Console.Write(value: int) : unit
Console.Write(value: float32) : unit
Console.Write(value: decimal) : unit
Console.Write(value: float) : unit
Console.Write(buffer: char []) : unit
   (+8 other overloads)
val i : int

  type: int
  implements: IComparable
  implements: IFormattable
  implements: IConvertible
  implements: IComparable<int>
  implements: IEquatable<int>
  inherits: ValueType
Multiple overloads
Console.WriteLine() : unit
Console.WriteLine(value: string) : unit
Console.WriteLine(value: obj) : unit
Console.WriteLine(value: uint64) : unit
Console.WriteLine(value: int64) : unit
Console.WriteLine(value: uint32) : unit
Console.WriteLine(value: int) : unit
Console.WriteLine(value: float32) : unit
Console.WriteLine(value: float) : unit
Console.WriteLine(value: decimal) : unit
   (+9 other overloads)

In addition to just nicely colorizing the F# code, it provides hover tooltips in your browser, much like you’d get from Visual Studio.  Go ahead and hover over the identifier “maxIteration” and see that it is an “int”, for example.  It’s awesome, right?

(By the way, yes, the Mandelbrot code I stole mercilessly from Luke’s recent timely blog.)

Anyway, Tomas’ tool is so cool I had to immediately try it out in a blog post before I went to sleep tonight.  Here’s the output of the program, by the way:

TextMandelbrot

With PDC coming soon, one imagines there may be other exciting F#-related announcements coming soon as well!