YAML 1.2 メモ (11) タグ

タグはスカラー、シーケンス、マッピングのそれぞれのノードにデータ型を指定します。一つのノードにタグ・プロパティを一つ指定でき、ノードに指定できるデータ型は一つだけに限定されています。

タグにはグローバル・タグとローカル・タグの2種類があり、前者は URI、後者はシンボルです。タグをどのようなデータ型へ当てはめるかは YAML ストリームとは別に定義されているだろうスキーマの存在を仮定しています。スキーマといっても、仕様とワンセットで定義されている JSON スキーマYAML スキーマは人間向けの説明が記入されている HTML ページにすぎません。これらのスキーマのページは WWW 内から URL で参照できるようになっています。一方、タグには tag URI scheme RFC 4151 の利用が推奨されており、タグの URIスキーマページの URL の関係は機械的に解決できません。使う側が好きにやって良いみたいです。

さて、すべてのタグの基本は冗長タグです。冗長タグは、ビックリマークの後、鍵括弧の中にグローバルかローカルタグを1つだけ書き込みます。

---
# グローバル・タグ、コア・スキーマの tag:yaml.org,2002:str
!<tag:yaml.org,2002:str> 1      # これは整数ではなくて "1" という文字列です
---
# 同上。tag:yaml.org,2002:int
!<tag:yaml.org,2002:int> "1"    # これは文字列ではなくて、整数 1 です
---
# 同上。tag:yaml.org,2002:null
!<tag:yaml.org,2002:null> "NULL"  # これは文字列ではなくて、NULL です
---
# ローカル・タグ。ビックリマークで始める。URI で使える文字が利用可能
!<!schwarzschildprototypemarktwo> a regular folding parasol

冗長なものをいちいち使っていられないということで、タグ・ハンドルと呼ばれる便利機能を利用できます。

---
!!str 1         # デフォルトでは !<tag:yaml.org,2002:str>
---
! 1             # デフォルトでは !<tag:yaml.org,2002:str>
---
!!int "1"       # 同じく !<tag:yaml.org,2002:int>
---
!!null "NULL"   # 同じく !<tag:yaml.org,2002:null>
---
!schwarzschildprototypemarktwo a regular folding parasol

タグ・ディレクティブを使うことで、冗長でないタグのビックリマークを、どのような冗長タグへ変換するのか指定できるようになります。使い方によっては、見かけはローカル・タグでも、グローバル・タグにすることもできます。タグ・ディレクティブは単なる文字列置き換え指定なので、ローカルタグを簡略化するのにも使えます。

%TAG !! tag:example.net,2000:
---
!!str 1         # グローバルタグ !<tag:example.net,2000:str>
...
---
!foo "bar"      # ローカル・タグ !<!foo>
...
%TAG ! tag:example.net,2000:app/
---
!foo "bar"      # グローバル・タグ !<tag:example.net,2000:app/foo>
...
%TAG ! !schwarzschildprototype
---
!marktwo a regular folding parasol  # ローカルタグ !<!schwarzschildprototypemarktwo>

タグ・ディレクティブで置き換えるビックリマーク部分をタグ・ハンドルと呼びます。上のように無名のタグ・ハンドルだけでなく、名前付きのタグ・ハンドルも利用できます。名前付きのものはビックリマークで名前を挟み、名前には ASCII の英数字とハイフンを使えます。

%TAG !t! tag:example.net,2012:app/
%TAG !s! !schwarzschildprototype
---
!t!datetime 2012-12-12      # グローバルタグ !<tag:example.net,2012:app/datetime>
!s!marktwo a regular folding parasol # ローカルタグ !<!schwarzschildprototypemarktwo>