🧱

o3ちゃんはLispの括弧を閉じれない(OpenAI Codex CLI)

に公開

はじめに

この記事は、OpenAI Codex CLIを使っていて感じた事を書いています。私はo3にEmacs Lispで開発してもらっていますが、Lispの括弧を閉じるのが下手ということが分かってきました。もしかしたら他のLLMモデルでは、うまく括弧を閉じれるのかも知れませんが、2025年6月時点では最強格のLLMモデルであるo3でもそんな弱点があるよという記事です。
※ 追記: Gemini CLI + gemini-2.5-pro の構成でも同様にLispの括弧が閉じれない問題が出ることがわかりました。

LLMが得意とする言語、苦手とする言語

o3は200行を超えるプログラムをスイスイと書き、難しいアルゴリズムも実装しますし、PythonやTypeScriptでは、構文エラーとなるようなソースコードを生成したこともありません。こんなに賢いのに、何度やってもLispの括弧の対応を合わせることができません。LLMはネット上のソースコードを読んでいるため人気の言語ほど得意言語になるということが言われています。Emacs Lispは少ないのでしょうか?いや、そんなはずはありません。

括弧を合わせようと奮闘する様子

paren_missing1.png

これが括弧の対応を合わせようとして何度も失敗する様子です。見ていると、頑張れ!と応援してしまいます。人間に賢さを見せすぎると怖がられるので、油断させる作戦でしょうか…

o3は括弧の対応を合わせようと、ヤマ勘で括弧を減らしていっています。本当は、括弧を減らすと余計に被害が大きくなっているのです。(一番最初の状態から1個 ')' を増やすのが正解でした。)

paren_missing1.png

この例では見られませんが、時々、正規表現を使ったりgrepを使ったりで')'を数えたりで埒があきません。

なんでこんな事が起きるのか

これは私の予想です。

コーディングエージェントには括弧の対応を調べる道具が用意されていない

Emacs LispでLispを書いている人なら分かると思いますが、Lispプログラマは閉じ括弧の数なんか数えません。Lispの構文的な整合をインデントで見ています。(いわばPythonのインデントと同じです)

インデントが自然になるように開き括弧と閉じ括弧を置いているだけです。閉じる際はエディタがピカッと光って教えてくれるのでそれが合うまで ')' 括弧を足しています。

paren_guide1.png

コーディングエージェントにはこれを実行する道具が用意されていません。
その証拠に、o3が書くLispコードは閉じ括弧の数こそ合っていませんが、インデントは正しい高さになっています。つまりインデントで構文を表現するPython的視点からすれば合っているのです。

最後に

いかがでしたでしょうか。もしかしたら、私たちはコーディングエージェントに必要なツールを教えてあげずに酷いイジメをしているのかも知れません。将来、コーディングエージェントがvimを起動したりemacsを起動したりして高速でコーディングする様子を見られる日が来るのかも知れません。

Discussion