私はXML is not S-Expressionsを読んでいました。XML スコープは、S 式と同様に厳密です。そして、私が見たすべてのプログラミング言語では、次のことはできません。
<b>BOLD <i>BOTH </b>ITALIC</i>
==太字 両方 斜体
S 式でも表現できません。
(bold "BOLD" (italic "BOTH" ) "ITALIC" )
== :(
この種の「重複」スコープをサポートするプログラミング言語はありますか? 実用的な用途はありますか?
私はXML is not S-Expressionsを読んでいました。XML スコープは、S 式と同様に厳密です。そして、私が見たすべてのプログラミング言語では、次のことはできません。
<b>BOLD <i>BOTH </b>ITALIC</i>
==太字 両方 斜体
S 式でも表現できません。
(bold "BOLD" (italic "BOTH" ) "ITALIC" )
== :(
この種の「重複」スコープをサポートするプログラミング言語はありますか? 実用的な用途はありますか?
重複するマークアップ構造には、多くの実用的な用途があります。たとえば、人文科学におけるテキスト分析のための並行マークアップの適用を考えてみましょう。重複する構造のマークアップに関する国際ワークショップは、次のように述べています。
重複する構造はどこにでもあり、航空機の整備マニュアルや古代の経典や典礼の作品など、さまざまなテキスト マークアップのアプリケーションに表示されます。「オーバーラップの問題」は、テキスト エンコーディングが、特定の階層のスナップショット ビューを超えて、テキストの複数の同時発生側面を表現および処理するときに、醜い頭を上げます。これには、複数のバージョンおよびバリアントにわたるテキストの進化を反映する機能が含まれます。 、注釈的または参照的、分類学的または局所的。
オーバーラップは、技術文書や製品マニュアル (バージョン管理)、法規 (有効性)、文学作品 (散文と劇的な構造、修辞構造、注釈)、聖典 (章と詩の参照と文の構造と解説) など、さまざまなテキストの問題です。 )、および言語コーパス (複数層の言語注釈)。
Text Encoding Initiative (TEI)は、ネストされていない情報を処理するためのガイドラインを公開し、オーバーラップのための XML 構文を提供しています。彼らは 2004 年に次のように述べています。
形式的な単純さ、発生するまたは想像できるすべての種類の構造を表現する能力、形式的または機械的な検証への適合性、およびより単純なケースに必要な表記法との明確な同一性(つまり、ケーステキスト機能が適切にネストされている場所)。
重複する構造を処理するためのいくつかのオプションには、次のものがあります。
SGMLには、オーバーラップ構造をサポートするために使用できるCONCUR機能がありますが、Goldfarb (標準の作成者) は、「したがって、ドキュメントの複数の論理ビューを作成するために CONCUR を使用しないことをお勧めします」と書いています。
GODDAGは、重複する構造を持つドキュメントを表すためのデータ構造を提供します。
XCONCURは、並行階層を XML のような方法で表現する便利な方法を提供することを主な目標とする実験的なマークアップ言語です。
正式な定義でスコープの重複をサポートするプログラミング言語はおそらくないでしょう。技術的には可能ですが、実装が必要以上に複雑になります。また、間違いである可能性が非常に高いものを有効なものとして受け入れることで、言語が曖昧になります。
私が今思いつく唯一の実用的な使い方は、マークアップでの属性の記述が不要な引用符なしでより直感的に感じられるのと同じように、タイピングが少なくなり、より直感的に記述される<foo id=45 />
ことです<foo id="45" />
。
入れ子構造にすることで処理効率も上がると思います。ネストされた構造を強制することにより、パーサーはノードを単一のスタックにプッシュおよびポップして、開いているノードのリストを追跡できます。スコープが重複している場合は、 begin-new-scopeトークンに遭遇するたびに追加する必要があるオープン スコープの順序付けられたリストが必要になります。次に、 end-scopeトークンに遭遇するたびにスキャンして、どのオープンスコープは、それが閉じるものである可能性が最も高いです。
オーバーラップ スコープをサポートするプログラミング言語はありませんが、エラー回復アルゴリズムの一部としてオーバーラップをサポートする HTML パーサーがあり、すべての主要なブラウザーに含まれています。
また、Cswitch
のステートメントでは、 Duff の Device のように、スコープが重複しているように見える構造を使用できます。
switch(count%8)
{
case 0: do{ *to = *from++;
case 7: *to = *from++;
case 6: *to = *from++;
case 5: *to = *from++;
case 4: *to = *from++;
case 3: *to = *from++;
case 2: *to = *from++;
case 1: *to = *from++;
} while(--n>0);
}
したがって、理論的には、プログラミング言語は一般的にスコープに対して同様のセマンティクスを持ち、必要に応じて最適化のためのこれらの種類のトリックを許可できますが、可読性は非常に低くなります。
このgoto
ステートメントは、break
一部continue
の言語では、オーバーラップしたスコープのように動作するようにプログラムを構成することもできます。
BOLD: while (bold)
{ styles.add(bold)
print "BOLD"
while(italic)
{ styles.add(italic)
print "BOTH";
break BOLD;
}
}
italic-continued:
styles.remove(bold)
print "ITALIC"