ライブラリ利用者様にインテリセンスのきかない独自言語なんて使わせたら開発者としてダメ

タイトル、まあ、宗教論争になるだけなんですが。

DSL的なものからC#C++のクラスのソースを生成

とりあえずまず、何でこのタイトルの話に至ったかという話から。

同僚の人が、言語中立な型定義言語から C# とか C++ のクラスを自動生成するようなものを作ってたんですね。
(実際にはもっといっぱい機能があって、クラスの自動生成はおまけ的なものなんですが。)

PowerShell を使って書くと、以下のような感じ。

(眠い中適当に描いたからなんか変ね・・・。Point が何で面積持ってるんだか。)

# 型定義
$definition = @{
	Name = "Point";
	Property = @(
		@{ Name = "X"; Type = "int" }
		@{ Name = "Y"; Type = "int" }
	);
	Method = @(
		@{ Name = "Area"; ReturnType = "int" }
	)
}

# テンプレートその1、C#
@"
class $($definition.Name)
{
$(foreach($p in $definition.Property) {
"	$($p.Type) $($p.Name) { set; get; }`n"
})}
"@

# テンプレートその2、C++
@"
class $($definition.Name)
{
$(foreach($p in $definition.Property) {
"	const $($p.Type)& Get$($p.Name)() const { return m_$($p.Name); }`n"+
"	$($p.Type)& Get$($p.Name)() { return m_$($p.Name); }`n"+
"	void Set$($p.Name)(const $($p.Type)& x) { m_$($p.Name) = x; }`n"
})}
"@

実際に同僚の人が書いてたのはRubyですけども、宗教上の理由(単にRuby書けないだけ)でPowerShell化。

同僚の人は、型定義の部分もRubyで書いてたんですよね。まあ、DSLチックに。なので、僕もここではPowerShellの文法使って$definitionを定義。

でも、個人的には、型定義のソースがRubyとかPowerShellってのが少々気持ち悪い。XMLにでもしたいわけですよ、以下のように。

<Type>
	<Name>Point</Name>
	<Property Name="X" Type="int"/>
	<Property Name="Y" Type="int"/>
	<Method Name="Area" ReturnType="int"/>
</Type>

で、これをtest.xmlとか適当な名前で保存したとして、さっきのPowerShellの$definitionの行を以下のように修正。

$definition = ([xml]$(Get-Content test.xml)).Type

ソースを生成する部分はさっきと全く同じでOK。
Rubyで同じことするにはXMLのパーサーが必要ですけども。)

Ruby/PowerShellDSL」 VS 「XML

で、同僚いわく、

  • どうせRubyで実行するんだから、定義ファイルもRubyDSLでいいじゃない
  • 他のツールにも食わせたければ、別に中間言語を生成すればいいわけだし
  • XML なんて糞なもの手で書きたくない

自分いわく、

  • RubyDSLだとインテリセンス効かないし
  • インテリセンスの効かない独自言語なんて学習する気にもなれない
  • XSD書いてインテリセンスに頼らせて

ということで宗教論争に至ると。

たぶん、「インテリセンスを使うのがデフォ」かどうかが宗派の違いになってるんだと思います。

XMLがダメならじゃあ何ならいいんだよ

まあでも、XMLが冗長性多くて書きたくないってのはもっともな言い分。

自分はインテリセンスに頼って書くのがデフォだから気にならないものの、ツールに頼りたくないって人が多いのも事実なわけで。ツールに依存しないと決めた瞬間、XMLは糞になりますからねぇ。

で、思ったのが、JSONスキーマ定義&補完の効くツールがあればなぁ・・・と。XML嫌いだけども、JSONには抵抗ない人は結構いる気がする。

JSONスキーマは今、まさに提案されてる真っ最中らしいんですけども。今、提案中だと、決まるのいつになるやら。それが確定したとして、Visual Studioは対応してくれるんでしょうか。