Cω
[id:lethevert:20050707:p1]でも指摘したことですが、SQLがいやなんです。
なんとかならないかと思っていたのですが、真正面から取り組んだ言語があることを見つけました。実験中の言語ですが、microsoftの研究で、Cωという言語があることが分かりました。
http://research.microsoft.com/Comega/
http://research.microsoft.com/Comega/doc/comega_whatis.htm
http://www.gdncom.jp/general/bbs/ShowPost.aspx?PostID=13042
以下のように、SQLを言語要素の一つとして備えるようです。そのため、SQLに対して、コンパイル時の文法チェックをかけられるとかかれています。
SQL-like expressions
Just as Cω includes XPath-like queries to process semi-structured data, we should like to offer similar functionality for processing relational data. Thus Cω includes a simple fragment of SQL, including selection with projection, filtering, ordering, grouping, and joins. The advantage of including these features in the language mean that we can synactically check the queries, and also use compile-time type checking.
Below is a fragment of a Cω program that uses a select expression to return all the unitprice/quantity pairs from some orders with matching zip codes. We highlight various parts of the select expression and discuss them below in further detail.
同様に、XMLも言語要素の一つとして備えるようです。
XPath-like features
As an example consider the following XQuery code, that is taken from the W3C's Use cases document. It operates on a bibliogrpahy, that contains a number of books. For each book in the bibliography, it lists the title and authors, grouped inside a 'result' element.for $b in $bs/book return <result> {$b/title} {$b/author} </result>In Cω the code is almost identical (by design!).
foreach (b in bs.book) { yield return <result> {b.title} {b.author} </result>; }
XML literal expressions
Cω provides a convenient way to construct object graphs using an XML literal expression. The following is from the XSVG sample provided with the compiler installation. It builds a an SVG graphic object using an XML literal expression:<svg width=1000 height=1000 viewBox="0 0 1000 1000"> </rect x=0 y=0 width=1000 fill="gray"/> </g fill="black" stroke="black"> {MoirePattern(1000, 1000, 80)} </g> </svg>;
で、組み合わせで以下のような記述も可能なようです。http://blogs.sqlpassj.org/yoneda/archive/2004/07/16/3380.aspx
tr* pokemon = select <tr><td>{Name}</td><td>{HP}</td></tr> from Pokedex;
他に、[id:lethevert:20050726:p1]で指摘したタプル(tuple)も使えるようです。
Anonymous structs ("tuple types")
The second family of structural types we add are anonymous structs, which describe ordered collections of heterogeneous values. An anonymous struct is like a tuple in ML or Haskell and is written, for example struct{int i; Button;}. A value of this type contains a labelled member i of type int and an unlabelled member of type Button. We can construct a value of this type with the following expression:new(i=42,new Button())
Cωは、データの取り扱いの機能拡張に関して、OCamlから派生したJoCaml(http://pauillac.inria.fr/jocaml/)からアイデアを取り込んだということらしいです。
In the case of our data extensions, many of the underlying ideas come from functional programming.
このCωですが、C# 3.0にその成果が取り込まれるということになっているようで、実験段階から実用段階へのステップを進んでいるようです。
http://blogs.wankuma.com/naka/archive/2005/06/08/12413.aspx
僕は今まで、C#にはあまり興味はなかったんでほとんど調べていなかったのですが、こんなことができるとなると、考え方を変えた方がいいかもしれないですね。
Spec#
microsoftは、C#の発展として、Cωのほかに、Spec#というものも研究していて、こちらでは、Design by Contractを言語に取り込もうとしているようです。
http://www.divakk.co.jp/blog/aoyagi/archive/2004/11/17/631.aspx
http://www.divakk.co.jp/blog/aoyagi/archive/2004/11/18/633.aspx
知らなかったのですが、C#って、Delphiを作った人が設計している言語なんですね。
うーむ。microsoft面白いかも。