Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
FineArchs opened this issue Apr 25, 2024 · 7 comments
Open

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

FineArchs opened this issue Apr 25, 2024 · 7 comments

Comments

@FineArchs
Copy link
Member

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

案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
@salano-ym
Copy link
Member

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

@ikasoba
Copy link
Collaborator

ikasoba commented Apr 28, 2024

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

@FineArchs
Copy link
Member Author

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

@marihachi
Copy link
Contributor

marihachi commented Jun 17, 2024

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

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

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

@FineArchs
Copy link
Member Author

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

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

@FineArchs
Copy link
Member Author

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

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

@FineArchs
Copy link
Member Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

4 participants