SAD部屋 - Ticket-44 Diff
- Added parts are displayed like this.
- Deleted parts are displayed
like this.
! LINEによるパターンマッチにて、末尾に否定形の列挙{^...}を使うと意図通りのマッチングが得られない
:Priority:Normal
:Reporter:amorita
:Status:Assigned
:Assigned to:amorita
:Version:5203
:Milestone:?:Milestone:5205
:Created:2018-01-31
!! Description
LINEによるパターンマッチにて、末尾に否定形の列挙{^...}を使うと意図通りのマッチングが得られない
例えば、FFS起動時の状態にて
LINE["NAME"] -> {"\$DUMMYMARK","\$DUMMYDRIFT","\$\$\$"}
Select[LINE["NAME"], StringMatchQ[#, "*{^T}"]&] -> {"\$DUMMYMARK","\$\$\$"}
LINE["NAME", "*{^T}"] -> {"\$DUMMYMARK","\$DUMMYDRIFT","\$\$\$"}
パターン'''"*{^T}"'''に対して、"\$DUMMYDRIFT"がマッチしている
一方、Elementに関しては意図通りのマッチが得られる
LINEでのパターンマッチを判定しているのは、tflinestk@src/tftwiss.fから呼び出される'''temat@src/temat.f'''
!! Attachement files
{{attach_map('Ticket-44')}}
{{attach_form('','')}}
!! Changelog
!!!amorita (2018-01-31 (水) 23:18:17)
'''temat'''の動作解析結果
* パターンにメタ文字を含む場合の判定は、'''tmatchl'''で判定される
* mult(i) == 0の場合(Elementの実体化が1個の場合)に、暗黙のindex付きのLINE名に対してもマッチングが行われる
** 上記の例題では、'''\$DUMMYDRIFT.1'''に対するパターンマッチ判定が行われる
*** '''"*{^T}"'''は、これにマッチする
!!!amorita (2018-01-31 (水) 23:32:50)
* Elementの処理には、index付き名の処理は存在しない
!!!amorita (2018-01-31 (水) 23:48:57)
参照解決動作の不整合
* tematが呼び出すelname1@src/elname.fは、mult(*) .eq. 0のケースに対して暗黙のindex付きのLINE名を生成する
* ielmh@src/ielm.fには、mult(*) .eq. 0となるケース(singlet element)にて、iord .eq. default-INDEXの処理を含まない
** '''r5204にて、実装'''
!!!amorita (2018-02-01 (木) 01:54:14)
tematの動作は、renumberサポート追加以前からmult(*).eq.0ケース(singlet element)に対しては暗黙のindex付きLINE名にマッチする
従って、現行のLINEによるパターンマッチ動作は仕様の範囲内と考えられる
現行LINEに実装されている'''@'''接頭辞に倣って何らかの接頭辞によってsinglet elementに対する暗黙のindex付きLINE名マッチの無効化を提供すべきか?
また、仮に提供する場合の適切な接頭辞は?
* backslashは、エスケープを必要とするので不適
* exclamation markは、否定を連想するので不適
** SADScriptユーザーにとっては、tildeも同様に不適?
!!!amorita (2018-02-01 (木) 10:44:48)
tematの動作を拡張する場合の実装形態の検討
# tematにlogicalな引数を追加する
# tematのpattern列先頭にメタ文字を埋め込む
# tematの派生APIを別途設ける
* (1)の場合、15箇所の書き換えが必要な上、ほとんどのケースではデフォルト動作を指定することになるので無駄が多い
** optional属性を使う場合、interface宣言が必要となり、呼び出し側に修正が必要
** optional属性を使うのであれば、関連APIを含めてmodule化して、module参照に切り替えるべき
*** moduleに取り込んだAPI群の呼び出し側にもmodule参照が必要となる
* (2), (3)の場合、標準のtemat呼び出し側に変更は不要
* (3)の場合は、コードフローの複製(保守性の悪化)もしくは、汎用tematに対する特殊化した呼び出しヘルパー(関数呼び出しオーバーヘッド)が必要
** ヘルパー関数を呼び出し元へインライン展開する場合、module参照が前提となるので(1)の議論に戻る
** ヘルパー関数へ汎用tematがインライン展開もしくはテンプレート展開できれば理想的(生成オブジェクトは、コードフローを複製したケースに相当)
局所的かつ保守性の高い変更を想定すると、(2)の実装が有望?
!!!amorita (2018-02-01 (木) 13:11:13)
r5205にて、実験的にbackquote接頭辞によるinglet elementに対する暗黙のindex付きLINE名マッチ抑制機能を実装した
{{its_edit_ticket_form}}
:Priority:Normal
:Reporter:amorita
:Status:Assigned
:Assigned to:amorita
:Version:5203
:Created:2018-01-31
!! Description
LINEによるパターンマッチにて、末尾に否定形の列挙{^...}を使うと意図通りのマッチングが得られない
例えば、FFS起動時の状態にて
LINE["NAME"] -> {"\$DUMMYMARK","\$DUMMYDRIFT","\$\$\$"}
Select[LINE["NAME"], StringMatchQ[#, "*{^T}"]&] -> {"\$DUMMYMARK","\$\$\$"}
LINE["NAME", "*{^T}"] -> {"\$DUMMYMARK","\$DUMMYDRIFT","\$\$\$"}
パターン'''"*{^T}"'''に対して、"\$DUMMYDRIFT"がマッチしている
一方、Elementに関しては意図通りのマッチが得られる
LINEでのパターンマッチを判定しているのは、tflinestk@src/tftwiss.fから呼び出される'''temat@src/temat.f'''
!! Attachement files
{{attach_map('Ticket-44')}}
{{attach_form('','')}}
!! Changelog
!!!amorita (2018-01-31 (水) 23:18:17)
'''temat'''の動作解析結果
* パターンにメタ文字を含む場合の判定は、'''tmatchl'''で判定される
* mult(i) == 0の場合(Elementの実体化が1個の場合)に、暗黙のindex付きのLINE名に対してもマッチングが行われる
** 上記の例題では、'''\$DUMMYDRIFT.1'''に対するパターンマッチ判定が行われる
*** '''"*{^T}"'''は、これにマッチする
!!!amorita (2018-01-31 (水) 23:32:50)
* Elementの処理には、index付き名の処理は存在しない
!!!amorita (2018-01-31 (水) 23:48:57)
参照解決動作の不整合
* tematが呼び出すelname1@src/elname.fは、mult(*) .eq. 0のケースに対して暗黙のindex付きのLINE名を生成する
* ielmh@src/ielm.fには、mult(*) .eq. 0となるケース(singlet element)にて、iord .eq. default-INDEXの処理を含まない
** '''r5204にて、実装'''
!!!amorita (2018-02-01 (木) 01:54:14)
tematの動作は、renumberサポート追加以前からmult(*).eq.0ケース(singlet element)に対しては暗黙のindex付きLINE名にマッチする
従って、現行のLINEによるパターンマッチ動作は仕様の範囲内と考えられる
現行LINEに実装されている'''@'''接頭辞に倣って何らかの接頭辞によってsinglet elementに対する暗黙のindex付きLINE名マッチの無効化を提供すべきか?
また、仮に提供する場合の適切な接頭辞は?
* backslashは、エスケープを必要とするので不適
* exclamation markは、否定を連想するので不適
** SADScriptユーザーにとっては、tildeも同様に不適?
!!!amorita (2018-02-01 (木) 10:44:48)
tematの動作を拡張する場合の実装形態の検討
# tematにlogicalな引数を追加する
# tematのpattern列先頭にメタ文字を埋め込む
# tematの派生APIを別途設ける
* (1)の場合、15箇所の書き換えが必要な上、ほとんどのケースではデフォルト動作を指定することになるので無駄が多い
** optional属性を使う場合、interface宣言が必要となり、呼び出し側に修正が必要
** optional属性を使うのであれば、関連APIを含めてmodule化して、module参照に切り替えるべき
*** moduleに取り込んだAPI群の呼び出し側にもmodule参照が必要となる
* (2), (3)の場合、標準のtemat呼び出し側に変更は不要
* (3)の場合は、コードフローの複製(保守性の悪化)もしくは、汎用tematに対する特殊化した呼び出しヘルパー(関数呼び出しオーバーヘッド)が必要
** ヘルパー関数を呼び出し元へインライン展開する場合、module参照が前提となるので(1)の議論に戻る
** ヘルパー関数へ汎用tematがインライン展開もしくはテンプレート展開できれば理想的(生成オブジェクトは、コードフローを複製したケースに相当)
局所的かつ保守性の高い変更を想定すると、(2)の実装が有望?
!!!amorita (2018-02-01 (木) 13:11:13)
r5205にて、実験的にbackquote接頭辞によるinglet elementに対する暗黙のindex付きLINE名マッチ抑制機能を実装した
{{its_edit_ticket_form}}