Pure JavaScript 3D Engine

今のところ Volta サンプル はどれもブラクラ並の重量を誇るので,下手にリンクを張らない方が良いのかもしれませんが,Utah Teapot サンプルを見ていると PC-9801 VM で動いていたデモプログラムを何となく思い出してつい書いてみたり.クリックするときはタスクマネージャを起動してダウンロードサイズに注目.
http://labs.live.com/volta/samples.aspx:image:large
Volta Sample Applications

Volta 探検

半分予想はしていたものの,C:\Program Files\Microsoft Live Labs Volta\Cache\ の下にあるものを実際見てみると正直なところ引きますな.とりあえずうちの環境には合計 56.4 MB,総計 7021 個の JavaScript ファイルがありました.てか中身が……
box 化された値型とか Generics の共変/反変とか,重箱の隅系の Verifiable Code 食わせてうまく変換できるか遊んでみるんですかね,これは.
しかしバグ見つけてもどこに報告すりゃいいんだろう? と思ったらもうフォーラムができてるのか.
MSDN Forums » Data Platform Development (Pre-release) » Microsoft Live Labs Volta

Volta 探検 (2)

思った以上に NotSupported 扱いの型/メンバが多いかも.
id:siokoshou:20071126#c1196036439 であったらいいなぁと書いたブラウザ上で動く C# コンパイラは無理にしても,せめてExpression Trees のデモぐらいなら作れるかと思って試してみましたが,NotSupported ばっかりで全然ダメそうでした*1
現時点の Volta ですが,プリミティブな型を使った純粋なアルゴリズムで鋭意工夫という感じになりそうです.文字列処理とか数列計算,3D 計算なんかはまあ題材としては無難と.あとはまあ Web ならではの非同期対応をスパイスに味付けですか.
どう書く?org にあるようなお題 であればそれほど不自由を感じさせないかもしれませんね.
とりあえず FizzBuzz でも.

using System.Linq;
using Microsoft.LiveLabs.Volta.Html;

namespace FizzBuzzVolta
{
    public partial class VoltaPage1 : Page
    {
        public VoltaPage1()
        {
            InitializeComponent();

            var button = new Button() { InnerText = "FizzBuzz!" };
            var input = new Input() { Value = "100" };

            var para = new Paragraph()
            {
                button,
                new Span(){ InnerText = "upto: "},
                input,
            };

            button.Click += () =>
            {
                int upto = 0;
                if( !int.TryParse(input.Value, out upto) ) return;

                var table = new Table()
                {
                    new TableBody
                    (                        
                        from x in Enumerable.Range(1, upto)
                        let a = x % 3 == 0 ? "Fizz" : ""
                        let b = x % 5 == 0 ? "Buzz" : ""
                        let c = (x % 3 != 0 && x % 5 != 0) ? x.ToString() : ""
                        select new TableRow()
                        {
                            new TableCell() { InnerText = x.ToString() },
                            new TableCell() { InnerText = a + b + c }
                        } as HtmlElement
                    )
                };

                this.Document.Body.Add(table);
            };

            this.Document.Body.Add(para);
        }
    }
}

なにげに どう書く?orgC# + Volta のコードで投稿しまくるってのはありなのかも.

*1:実はJavaScript 変換が無理っぽい部分だけサーバサイドで動かせばなんとかなる? セキュリティについてはとりあえず忘れることにして