一日一処: 瞬間的にJavaScriptとPythonを空目する文字列を取り扱うコード

2024/02/21に公開

スクリプト言語

JavaScriptやPythonはいわゆるスクリプト言語と呼ばれる種類のもので、他にはRubyなども記法の雰囲気がなんとなく似ているものがある。
複数のプログラム言語を触れたことある人は、パッとあるソースコードを見たときに、ふむふむ、この言語だなと察することもできる。特にドラマやCMなどのソースコードが映るシーンで一時停止した事がある人も少なくないだろう。

空目するコードを作る

name = 'bob'
print(f'Hello {name}')

さて、このコードをみて、一体なんの言語だと思うだろうか。瞬間的に目が行くのは、変数宣言だろう。変数宣言で、宣言子がない言語は限られてくる。次に、出力関数だ。これも似たような関数名が多いため、あまり判断軸にはならない。
一番気になるのは、f文字列だろう。この名称、明らかに「Fワード」感があって、いまいち好きになれないが、この記法で、おそらく多くの人がPythonだと識別すると思う。
だが、次のコードだとどうだろうか。

name = 'bob'
print(f`Hello {name}`)

おそらく脳内が混乱する人もいるかも知れない。というよりかは、瞬間的に見ると、おそらくPythonだと思う人が多いかもしれない。ただ、これは、上記で使用している関数の一部を隠している。全文は以下だ。

function print(text) {
  console.log(text)
}

function f([text]) {
  const matches = text.matchAll(/{(\w+)}/g)
  let result = text
  for (const [target, variable] of matches) {
    let data
    try {
      data = eval(variable)
    } catch (_) {
      data = ''
    }
    result = result.replace(target, data)
  }
  return result
}

name = 'bob'
print(f`Hello {name}`)

print関数は、触れなくてもいいだろう。気になるのは、f関数か。これは、タグ付きテンプレートを利用したものだ。簡単ではあるが、Pythonらしいf文字列を再現している関数となる。
仕組み自体は、難しくなく、文字列を正規表現で分解し、変数名として記述されている部分をevalで呼び出し、元の文字列に合流している。本来、テンプレートリテラルを用いれば、${name}というふうに記述するが、タグ付きテンプレートを用いれば、このような事が可能だ。Pythonに寄せたいプログラムを書きたい訳では無いが、似たようなことができることを紹介しておきたかった。

おわりに

いくつかの技術書を読んでいると、プログラム言語が他の言語の機能を取り込んで、バージョンアップしているということを目にすることがある。実際、Javaは、15年前と比べ、全く違う言語なのではないか、というくらい、変化が激しかったりする。他言語を学ぶときに、知ってる言語の再現ができるのか考えると学びの一端になるかもしれない。また、個人的にも将来的に使用される言語は、狭まってくると考えているため、結局は一つの言語しか選択肢がないような世界になるかもしれない。

Discussion