LoginSignup
6
3

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-12-04

はじめに

この記事は 湯婆婆 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キーを押すと入ります。 

6
3
0

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
  3. You can use dark theme
What you can do with signing up
6
3