feat: インデント可能文字列構文
複数行に渡る文字列を書く時にインデントとの兼ね合いで困ることが多いので、次のような構文を提案します。
案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
str.dedent関数を用意する方法も良いと思います
個人的に案1がシンプルだと感じました 標準関数で提供するのも応用が効きそうですね
関数でやってもいい気がしてきました
実装が複雑になりそうな気がします。 単純にインデントを無視するわけではないため、例えばインデントがタブと空白の混合であった場合などに全体としてのインデント幅の取得処理は複雑になります。 見た目上のインデント幅と動作を一致させるには結構な苦労がいると思います。
その他の一般的な解決案として、行単位で配列に入れるという方法があると思います。この方法であれば、構文の追加や関数の追加も必要ありません。
var str = ''
if (cond)
str = [
'line1'
' line2'
'line3' // コメント
].join(Str:lf)
<: str
その他の一般的な解決案として、行単位で配列に入れるという方法があると思います。この方法であれば、構文の追加や関数の追加も必要ありません。
それはまあそうなんですよね、実際私もそうしてますし それはそれとして新しく文法を作りたいと思う動機がissueを作った当時はあったはずなんですが、今となっては思い出せなくなってしまって… 正直今はそれでいいのでは?という気持ちになってます
実装が複雑になりそうな気がします。 単純にインデントを無視するわけではないため、例えばインデントがタブと空白の混合であった場合などに全体としてのインデント幅の取得処理は複雑になります。 見た目上のインデント幅と動作を一致させるには結構な苦労がいると思います。
これに関しては、タブの幅は環境によって変わりますから、そもそもインデント幅の計算などはする気がありませんでした。 単純計算で除去できなければエラーにするつもりでした。簡易的なlintにもなりますし
あーでも、案3はともかく他の案とdedentに関しては単純に'の量を減らせるのが利点になりますね
やっぱりやりたいかも?