Skip to content

Instantly share code, notes, and snippets.

@leque
Last active December 29, 2022 00:36
Show Gist options
  • Save leque/401b4e1e78b30fa85ecb813770f6a859 to your computer and use it in GitHub Desktop.
Save leque/401b4e1e78b30fa85ecb813770f6a859 to your computer and use it in GitHub Desktop.
SATySFiの文字列構文まわり試案

SATySFiの文字列構文まわり試案

概要

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構築などにも利用できる。

課題

  • タグ付き文字列のタグの名前空間は変数と同一になるため、sfといった短いタグ名はシャドウイングされてしまう可能性が高い。ScalaではStringContextのメソッド呼び出しに変換することでこれを回避している。

参考

Appendix

SATySFiの文字列の扱いに対する提案 - puripuri2100が進捗の報告をするようですの文字列構文(#e`〜`等)との比較

本試案 puripuri2100
実現方法 ユーザー定義 ※1 処理系組み込み
タグ(モード)の名前空間 変数と同じ 独自
パターンマッチ 未考慮 可能

※1:タグ付き文字列は処理系組み込み

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment