SATySFiの文字列構文を整理し、拡張性が高く理解しやすい構文にする。文字列先頭/末尾の空白を自動で除去しないように変更する。現状の #`〜`
文字列や `〜`#
文字列を廃止する。
新たにタグ付き文字列(tagged-string)の構文を導入する。
- 現状の課題
- 特殊文字を書くための構文が不十分(改行文字、Unicodeエスケープ、……)
- 改行、空白文字除去のルールが不統一
- 必要な機能
- TBD
expr
= ...
| string
| positioned-string
| tagged-string
string = '`' string-content* '`'
string-content
= all-characters - '`' - '\'
| '\`'
| '\\'
positioned-string = '@' string
tagged-string = '@' lower-ident string
文字列(string)はエスケープシーケンス等の解釈はせず、 `〜`
の間に書かれた文字をそのまま要素とする。
例:
`a\nb` # U+0061 U+005C U+006E U+0062 の列
`a\`b` # U+0061 U+005C U+0060 U+0062 の列
`a\\b` # U+0061 U+005C U+005C U+0062 の列
` ab ` # U+0020 U+0061 U+0062 U+0020 の列
位置情報付き文字列(positioned-string)は文字列にメタ情報としてソースコード上の位置情報を付加したものである。 字句構文及び意味は文字列に倣う。
タグ付き文字列(tagged-string)は位置情報付き文字列を使った多段階計算を簡単に書くための省略記法である。 タグ付き文字列は下記のように展開される。
@tag`str` # → ~(tag @`str`)
tag @str
の文字列処理はstage 0で実行される。
エスケープシーケンスの解釈、文字列先頭/末尾の空白除去、インデント除去といったさまざまな文字列記法をタグ付き文字列をつかってユーザー拡張可能な形で導入する。
# エスケープシーケンスの解釈
@escaped`a\nb` # U+0061 U+000A U+0062 の列
@escaped`a\`b` # U+0061 U+0060 U+0062 の列
@escaped`a\\b` # U+0061 U+005C U+0062 の列
# 文字列先頭/末尾の空白削除
@ltrim` ab ` # U+0061 U+0062 U+0020 の列
@rtrim` ab ` # U+0020 U+0061 U+0062 の列
@trim` ab ` # U+0061 U+0062 の列
上記escaped
, ltrim
, rtrim
, trim
相当のタグは標準ライブラリとして提供し、一般ユーザーは多段階計算を意識しなくてもよい想定。
また、タグ付き文字列の展開結果は文字列である必要はないため、ユーザー定義リテラルやDSL構築などにも利用できる。
- タグ付き文字列のタグの名前空間は変数と同一になるため、
s
やf
といった短いタグ名はシャドウイングされてしまう可能性が高い。ScalaではStringContext
のメソッド呼び出しに変換することでこれを回避している。
- SIP-11 - String Interpolation | Scala Documentation : Scalaの文字列補間構文。この試案の多くの部分はSIP-11を参考にしている
- テンプレートリテラル (テンプレート文字列) - JavaScript | MDN:本試案の内容はおおむねタグ付きテンプレートからプレースホルダーを除いたものと同じである。
- gfngfn/SATySFi#290 (comment) : タグ付き文字列の構文はna4zagin3さんの提案によるものである
- SATySFiの文字列の扱いに対する提案 - puripuri2100が進捗の報告をするようです:異なるアプローチの提案
- https://github.com/gfngfn/SATySFi/compare/master...leque:SATySFi:tagged-string :タグ付き文字列の実装イメージ(動作未確認)
SATySFiの文字列の扱いに対する提案 - puripuri2100が進捗の報告をするようですの文字列構文(#e`〜`
等)との比較
本試案 | puripuri2100 | |
---|---|---|
実現方法 | ユーザー定義 ※1 | 処理系組み込み |
タグ(モード)の名前空間 | 変数と同じ | 独自 |
パターンマッチ | 未考慮 | 可能 |
※1:タグ付き文字列は処理系組み込み