プログラミング
JavaScriptにおける最高の駄洒落
The Greatest Pun in JavaScript (shukla.io)
要約
この記事では、プログラミング言語における「駄洒落」の概念を探求し、特にJavaScriptのタグ付きテンプレートリテラルに焦点を当てています。筆者は、文法的な曖昧さを利用して意味を変える言葉遊びとしての駄洒落を、シェイクスピアの例やプログラミングの文脈で解説し、JavaScriptの `${...}` 構文とオブジェクトの `{...}` 短縮記法が意図せず組み合わさることで生まれる、コード上で二重の意味を持つように見える「prompt」タグ関数の例を「最高の駄洒落」として紹介しています。
全文翻訳
シェイクスピアの作品には疑いなく駄洒落が満載されており、それは彼の言葉に対する習熟と愛情の表れです。文法的に正しい文を形成するために2つの単語を入れ替えることはめったにありませんが、彼は魔法のように言葉で遊びました。「賢い道化者であることは、愚かな賢者であることよりも良い。」(十二夜)上記の例では、名詞「fool」(道化者)が形容詞「foolish」(愚かな)に変わり、形容詞「witty」(機知に富んだ)が名詞「wit」(機知)に変わっています。最も単純な駄洒落は、文法のルールを利用して単語の意味を変えます。次に、文法以外の文脈を利用して意味を変えるような方法でフレーズで遊ぶ駄洒落があります。私のお気に入りの1つはこれです。「明かりを消し、そして明かりを消せ。」(オセロ)最初のフレーズは文字通りろうそくを消すことを意味しますが、2番目は誰か(この場合、デズデモーナ)を殺すことの比喩です。「pun」(駄洒落)の正式な辞書的定義は、通常「ユーモラスな」効果について言及します。「pun /pʌn/ 名詞 2つ以上の意味または異なる連想を示唆するように単語を使用すること、または異なる意味を持つ同じまたはほぼ同じ音の2つ以上の単語を使用して、ユーモラスな効果を生み出すこと。言葉遊び。」(オックスフォード英語辞典)さて、ユーモアは見る人の目にあると私はよく信じています。私にとって面白いことが、あなたにとっていつも面白いとは限りません。しかし、私がこれまで発見した最高の駄洒落を紹介したいと思います。それは英語ではありません。自然言語とプログラミング言語は1つの共通の性質を持っています。それは文法です。駄洒落がそれに対して何ができるかは、すでに見てきました。タグ付きテンプレートリテラルまず、文法の簡単な背景を説明します。JavaScriptには、次のような強力な文字列操作を可能にするタグ付きテンプレートリテラルというものがあります。const systemPrompt = dedent`あなたはコードレビューエージェントです。これらの手順に従ってください:1. PRをレビューする前に、最近関連するPRを見つけます。2. ... 3. ... 4. ... `;このコードでは、dedentはタグ関数であり、テンプレートリテラルを処理して余分なインデントを削除します。タグ関数は、リテラルのテキストピースと評価された${...}値を別々の引数として受け取るため、それぞれに対して好きなように処理できます。テンプレート言語ほとんどのテンプレート言語では、エンドプロダクトと同じ媒体でテンプレートを記述できます。つまり、変数が配置される穴のあるテキストです。コントロールが制御しているのと同じシステム内に存在する限り、物事は面白くなります。ここに探求する価値のあるゲーデルの不完全性に関するサイドクエストがいくつかあります。しかし、話がそれてしまいました。簡単なテンプレートの例を次に示します。hi {{ name }} {{ }} という構文は非常に一般的です。実際、次のテンプレート言語がそれを使用しています:Mustache Handlebars Jinja2 Django templates Liquid Angular templates Vue templatesプロンプトテンプレートリテラルこれを確認してください。次のようなプロンプトというタグ関数を定義できます。これは{{ }}テンプレートを受け入れているように見えます。const userPrompt = prompt`コードをレビューしてください。- PRへのリンク:${{ url }}- 追加のメモ:${{ notes }}- タイムスタンプ:${{ time }} `;見慣れていて、目に優しいですよね?舞台裏では、これは観察ツール(Helicone)によって処理される文字列を生成しており、プロンプトの分析に役立ちます。コードをレビューしてください。- PRへのリンク:<prompt id="url">https://github.com/etc/etc</prompt>- 追加のメモ:<prompt id="notes">単体テストファイルのみをレビューしてください</prompt>- タイムスタンプ:<prompt id="time">2026-09-26</prompt>私の意見では、クールな部分は、私たちのJavaScriptコードに現れる見かけの{{ }}テンプレート構文が偶然であるということです:${...}は内部のものを評価し、JavaScriptの{ name }オブジェクトの短縮記法は{ name: name }に相当します。タグ関数であるpromptは、文字列に適切に注釈を付けるために必要なすべてを持っています。あなたは${{ url }}を見ています。JavaScriptはJavaScriptが見ているものを1つ見ており、あなたは別のものを見ています。{{ url }}構文はあなたの頭の中にあります。…(沈黙)…さて、おそらく私は駄洒落をやりすぎましたが、私はそれに完全に誇りを持っています。私は2024年にHeliconeのJustinとこの件で協力しました。それは私が内部的に使用していたアイデアであり、JustinはそれをSDKで公式のものにしました(JustinのPR、私のPR)。私はその駄洒落が面白いと思いました。Justinはそれを含めることを喜んでいました。駄洒落とは、2つの解析を持つ1つの文字列です。文法モデルが復活しました、ベイビー!私はそれを真剣に受け止め、それらの確率分布を返します。空間言語では、私はそれをさらに悪化させ、パーサーに2次元目を渡します。