aiscript icon indicating copy to clipboard operation
aiscript copied to clipboard

feat: インデント可能文字列構文

Open FineArchs opened this issue 1 year ago • 7 comments

複数行に渡る文字列を書く時にインデントとの兼ね合いで困ることが多いので、次のような構文を提案します。

案1

最初の行と同じインデントを以降にも適用します。

var str = ''
if (cond) str = '''
  line1
    line2
  line3' // コメント
'''
<: str
line1
  line2
line3

案2

頭の空白を一律で無視します。

var str = ''
if (cond) str = '''
  line1
    line2
  line3' // コメント
  '  line4' // 空白を入れたい場合
'''
<: str
line1
line2
line3
  line4

案3

全て''で囲みます。

var str = ''
if (cond) str = '''
  'line1' // コメント
    'line2'
  '  line3'
  'line4-1' /* コメント */ 'line4-2'
'''
<: str
line1
line2
  line3
line4-1line4-2

FineArchs avatar Apr 25 '24 08:04 FineArchs

str.dedent関数を用意する方法も良いと思います

salano-ym avatar Apr 25 '24 09:04 salano-ym

個人的に案1がシンプルだと感じました 標準関数で提供するのも応用が効きそうですね

ikasoba avatar Apr 28 '24 14:04 ikasoba

関数でやってもいい気がしてきました

FineArchs avatar Apr 29 '24 16:04 FineArchs

実装が複雑になりそうな気がします。 単純にインデントを無視するわけではないため、例えばインデントがタブと空白の混合であった場合などに全体としてのインデント幅の取得処理は複雑になります。 見た目上のインデント幅と動作を一致させるには結構な苦労がいると思います。

その他の一般的な解決案として、行単位で配列に入れるという方法があると思います。この方法であれば、構文の追加や関数の追加も必要ありません。

var str = ''
if (cond)
  str = [
    'line1'
    '  line2'
    'line3' // コメント
  ].join(Str:lf)
<: str

marihachi avatar Jun 17 '24 16:06 marihachi

その他の一般的な解決案として、行単位で配列に入れるという方法があると思います。この方法であれば、構文の追加や関数の追加も必要ありません。

それはまあそうなんですよね、実際私もそうしてますし それはそれとして新しく文法を作りたいと思う動機がissueを作った当時はあったはずなんですが、今となっては思い出せなくなってしまって… 正直今はそれでいいのでは?という気持ちになってます

FineArchs avatar Jun 18 '24 10:06 FineArchs

実装が複雑になりそうな気がします。 単純にインデントを無視するわけではないため、例えばインデントがタブと空白の混合であった場合などに全体としてのインデント幅の取得処理は複雑になります。 見た目上のインデント幅と動作を一致させるには結構な苦労がいると思います。

これに関しては、タブの幅は環境によって変わりますから、そもそもインデント幅の計算などはする気がありませんでした。 単純計算で除去できなければエラーにするつもりでした。簡易的なlintにもなりますし

FineArchs avatar Jun 18 '24 10:06 FineArchs

あーでも、案3はともかく他の案とdedentに関しては単純に'の量を減らせるのが利点になりますね やっぱりやりたいかも?

FineArchs avatar Jun 18 '24 10:06 FineArchs