LoginSignup
3

More than 1 year has passed since last update.

posted at

updated at

Emacs Lispで湯婆婆を実装してみる

はじめに

この記事は 湯婆婆 Advent Calendar 2020 の5日目です。

こちらの記事をきっかけに、色々な言語で湯婆婆(入力された名前から1文字選んで新しい名前を付ける)を実装するのが流行っています。
原作者様: Javaで湯婆婆を実装してみる - Qiita

世の中にはいったい何種類のプログラミング言語があるのか…。令和のHello World!
【毎日自動更新】湯婆婆 LGTMランキング! - Qiita

だいたいのプログラミング言語は出てしまっているので、何にしようかなと思いましたが
Vim script で湯婆婆を実装してみる - Qiita
こちらからヒントを得て「Vim script があるなら Emacs Lisp があってもいいじゃない」ということで。

検証環境

  • Cygwin (Windows 10 20H2 Home)
  • GNU Emacs 27.1

コード

Emacsの設定ファイル (~/emacs.d/init.el など) に以下のコードを書いてください。

~/emacs.d/init.el
(defun yubaba (name)
  (interactive "sそこに名前を書きな。")
  (let* ((len (length name))
         (index (random len))
         (new-name (substring name index (+ index 1))))
    (message
     "フン。%sというのかい。贅沢な名だねぇ。\n今からお前の名前は%sだ。いいかい、%sだよ。分かったら\\
返事をするんだ、%s!!"
     name new-name new-name new-name)))

Emacsを再起動すると、yubaba コマンドが使えるようになります。
M-x yubaba 1 を入力すると湯婆婆が起動します。

M-x yubaba
そこに名前を書きな。

ここで名前を入力してEnterを押すと、湯婆婆は名前からランダムに1文字取って命名します。

そこに名前を書きな。山田太郎
フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は太だ。いいかい、太だよ。分かったら返事をするんだ、太!!

サロゲートペアにも対応しているようでした。

そこに名前を書きな。𠮷田
フン。𠮷田というのかい。贅沢な名だねぇ。
今からお前の名前は𠮷だ。いいかい、𠮷だよ。分かったら返事をするんだ、𠮷!!

解説

あまり解説することもありませんが、強いて言えば interactive でしょうか。

(interactive "sそこに名前を書きな。") を含む関数が M-x でコマンドとして呼び出されると、「そこに名前を書きな。」を表示して入力を促し、入力された内容を文字列としてその関数の第1引数 (name) にセットします。

interactive の使用例が書かれたページをいくつか挙げておきます。

ちなみに、この関数はコマンドとして動くだけではなく、普通の関数として (yubaba "山田太郎") のように引数を与えて呼び出すことも可能です。
例えば *scratch* などに (yubaba "山田太郎") と書いて、閉じカッコの後ろにカーソルを移動して C-x C-e を入力すると

"フン。山田太郎というのかい。贅沢な名だねぇ。
今からお前の名前は郎だ。いいかい、郎だよ。分かったら返事をするんだ、郎!!"

のように表示されます。このとき「そこに名前を書きな。」は表示されません。

お約束

名前を書かずにEnterを押すとクラッシュします。

そこに名前を書きな。
Args out of range: "", 339121942017045916, 339121942017045917

  1. M-x は Alt+Xキーを同時押しするか、Escキーを押した後にXキーを押すと入ります。 

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3