月別アーカイブ: 2023年4月

新しくプログラミング言語を作るときの区切り文字

Haskellにはリストやステートメントを区切るカンマやセミコロンを行頭に置くスタイルがあります。

primes = [ 2
         , 3
         , 5
         , 7
         ]
main = do { putStrLn "Hello world!"
          ; print primes
          }

ですが、「カンマやセミコロンを行頭に置く」というスタイルは他の言語のユーザーには奇異に映るのではないでしょうか。以下、そういう前提で話を進めます。

MarkdownやYAMLでは *- を行頭に置くので、「区切り文字が行頭にある」こと自体は悪くないはずです。Haskellで代数的データ型を定義するときの | を行頭に書いても初学者の違和感は少ないと思います(たぶん)。

普通のプログラミング言語で「行頭に区切り文字を置く」というスタイルを採用するとしたら、どういう区切り文字が適切なのでしょうか?

アスタリスク *, マイナス -, プラス +

この辺はデータ記述言語とかMarkdownでお馴染みですが、普通のプログラミング言語では演算子として使いたいのではないかと思います。

行頭に置いた場合のみ区切り文字として扱うという手も考えられますが、いずれにせよ「式を複数行にまたがって書くときに行頭に演算子を書く」というスタイルとの衝突が懸念されます。インデント量で識別するか、一部の言語のように継続行を表すマークを導入することになるでしょう。

あと、どっちみちインラインでリストを書くときの区切り文字には適していないので、従来のカンマも併用する必要があるかもしれません。

擬似コード:

primes = [
         * 2
         * 3
         * 5
         * 7
         ]

縦棒 |

ML系言語のデータ型定義で使われているやつです。

縦棒は慣習的に「または」の意味で使われることが多いので、リストや逐次実行などの順序が重要な用途には違和感があるのではないかと思います。まあMLのパターンマッチみたいに微妙に順序があるケースにも使われていたりしますが。

擬似コード:

primes = [
         | 2
         | 3
         | 5
         | 7
         ]

空白

レイアウトルールを採用している言語だとそもそも区切り文字が必要なかったりします。Haskellも逐次実行のdoはレイアウトルールによりセミコロンなしで書けます。

最近のHaskellにはQualifiedDoという拡張があって、それを使うと一時的にdo記法を乗っ取れるので、リストの構築に使えたりします:

module M where
import qualified Prelude

(>>) :: a -> [a] -> [a]
(>>) = (:)
{-# LANGUAGE QualifiedDo #-}
import qualified M

primes = M.do
           2
           3
           5
           7
           [] -- 型の関係で最後にこれが必要

他の例だと、Juliaは(多次元)配列を空白や改行区切りで書けるらしいです。空白と改行で意味が変わるみたいですが。

番号

番号から始めるという手もあります:

array =
  1. "first"
  2. "second"
  3. "third"
fn main() {
1. do_something()
2. do_something_else()
3. return 0
}

が、「行を削除したり、コピペで順序を入れ替えた時に修正が必要になる」という欠点があります。

それ以外

ASCIIの記号は少ないので、演算子と被らないように選ぶのは大変そうです。

ピリオド . は自然言語だと普通文末にあるのでカンマやセミコロンと同じ理由で向かない気がします。まあプログラミング言語だとメンバー名の区切りに使われることも多いし、Swiftだと識別子の前に置けたりするので大した問題ではないのかもしれない。

primes = [
         . 2
         . 3
         . 5
         . 7
         ]

コロン : は割とアリかもしれない?コロンは型注釈に使いたい気がするけど、行頭には使わないような?

primes = [
         : 2
         : 3
         : 5
         : 7
         ]

ハッシュ記号 # はどうかな。Markdownの見出しっぽいかもしれない。

primes = [
         # 2
         # 3
         # 5
         # 7
         ]

まとめ

なんか良さそうなのがあったら自分の言語に実装してみてください。擬似コードを載せた記事を書くのでも良いです。

あと、似たような趣旨の記事が既にあったみたいです: