はじめに
xyzzyというのは亀井哲弥さんという方が開発したWindows用のEmacsっぽいエディタである。
今から20年前に亀井さんご自身の手になる最後のアップデートが行われたっぽい。
それから6年後にxyzzy Projectという有志の会がxyzzyの開発を継承し,アップデートを行ったっぽいが,今から10年ほど前の日付がその活動が確認できる最後である。
ちなみに,xyzzyの読み方は正式に定められているものはないらしい。
私はエックス・ワィ・ズィーズィー・ワィとそのまんま読むことにしている。
エクシィ・ズィイーとか読めば短くておシャンティ(死語?!)かもしれない。
特に何もしたいわけではないのが問題
なんでLispを学ぼうとしているのか。
一応理由はいくつかあるが,いずれもしょぼい。しょぼすぎる。
まず,「そこにLispがあるから」。
FORTRANに次ぐ老舗の汎用プログラミング言語であり,そもそも記号処理を目的として設計されたモダンなことこの上ない人類の知の結晶の一つである。
私がLispなるものの存在を人づてに知ったのは30年近く前のことである。その間,ずっと心惹かれていたものの,真面目に学んだことがまったくない。
五十の手習いということでやってみようというわけである。
それで,とりあえず触ってみたい。それがもう一つの理由である。
そしてちょっと触っただけで満足するであろう予感もある。
で,なんでxyzzyにしたのかというと,そもそも私のパソコンはまったく開発環境が整っておらず,今さらなんかいろいろ導入するのはもう年齢的に無理だからである。
たぶんxyzzyは誕生したときらへんから存在を知っていたし,実際,これまで何度もインストールして数回起動した経験がある。また,何年か前にとある知り合いの方が話題に挙げていた気がする。そんな風に私の脳裏にこびりついていたのである。
久々に思い出してwebを検索してみるとちゃんとバイナリが落ちているし,そのままWindows11で動作する。そうくると使わない手などあろうか(いや無い)。
しかし,私の中身は空っぽであって,Lispを使ってアレをしたい,コレをしたいといったモチベがまったくない。
が,しばらく沈思黙考した結果,次のようなものくらいはやってみたいことがあった。
まず,プログラミング初級コースで避けては通れない洗礼である,hello, worldという文字列の表示である。これは絶対に外せない。
次に,再帰的な手続きの定番といえばEuclidの互除法である。それをLispで書くとどうなるかを見届けたい。
最後に,Peanoの公理系をLispで実装してみたい。
さらにアドバンストなコースとしては,SICPというSchemeなるLispの方言の一つを採用している古典的名著のプログラム例をCommon Lispという別の方言に直しながら読んでみたいとか,別にLispで無理して組まなくともよい気がする,整数成分の行列の掃き出し法の半手動計算支援システムの作成とか,PostのFormulation 1 や 1 アドレス方式のミニマルな感じのアセンブラ言語のシミュレータを作りたいとか,極めて個人的かつニッチな野望があるにはある。
こんな感じにLispを学び続けるための動機は極めて薄くて心許ないのだが,ぼちぼちやっていければ。
とりあえず動くには動くからよしとしよう
xyzzyを,そうだなー,一日一回起動というのは仕事のある期間はかなりキツい制約なので,週に1時間くらいは触ることにしよう。目標は低ければ低いほどよい。
一日目のミッションは,とにかくLisp処理系にhello, worldと返答させることを目標とする。
はてなブログに移籍したのでブログ記事の体裁の幅がかなり広がったのだが,はてな記法なるものを新たに学び,身に付ける気力がいかんせん無い。
が,挑戦していくしかあるまいて。
xyzzyを新規に立ち上げると,設定とかなんもいじっていなければ,デフォルトでLisp Interactionモードという,Lispで遊び放題の状態で立ち上がる。
そこで次のような一文を「バッファ」と呼ばれる編集画面にそのまま書き込み,文末でC-Enter(Ctrlキーを押したままEnterキーを押す)すると,エラーが表示されるか,記入したプログラムの実行結果が次の行以降に表示される。
なんかの拍子にxyzzyがLisp Interactionモードではなくなってしまっていた場合には,焦らず,Altキーを押したままXキーを押すと,xyzzyのミニバッファと呼ばれる領域に M-x: と表示されるので,自分でlisp-interaction-modeと書き込んでEnterすればLisp Interactionモードに変更できる。四半世紀前にEmacsやらMuleやらMeadowやらのお世話になっていたときの,遠い思い出である。
一日分の作業ノルマが完了したら,そのままxyzzyのウィンドウを閉じればよい。その際,記録を残しておきたければ適当に名前を付けて編集したバッファの内容を,例えば拡張子をxyzzyにして保存したり,特に思い入れがなければ「保存しない」を選択してさよならすればよい。
私の解答 (hello, world)
Lispのデータ型やら書き方の作法をほとんど知らないド素人なのだが,とりあえず,文字列は先頭にアポストロフィ(バッククォート?) ' を付けて「文字列」とシステムに認識してもらう必要があるらしい。
ところが,ここに大きな問題があって,私はとりあえず日本語は使えなくても構わないと考えているのだが,いわゆるASCII文字というか,英数字は使うつもりでいる。だが,
'hello, world
と書き込んで行末でC-Enterすると「変数が定義されていません: world」という,何を直せば納得させられるのかド素人にはさっぱりわからないエラーメッセージが表示されてしまう。
そこで,多くのプログラミング言語で「特殊文字」を「エスケープ」するオマジナイとしてバックスラッシュ \ が用いられるので,それを試してみる。
どうやらカンマ , はそのままでは使えないらしい。また,半角スペースも当然の如く特殊な文字なのでエスケープする必要があるようだ。
そこで次のようにしてみる。
'hello\,\ world
するとどうでしょう!C-Enterを押した途端,この文字列の次の行に
|hello, world|
と表示されるではありませんか!
これで一応はミッションが達成されたこととなる。
だが,ここで疑問が一つ。
hello, worldという文字列だけを表示して欲しいのだが,その前後に括弧のようについている縦棒 | はなんじゃろか?
それを外す方法はあるんか?
この謎が解明する日は果たして訪れるのであろうか。
学び方について
Lispの基本をどうやって学ぶのか。
今現在,最も楽で確実そうなのは大規模言語モデル (LLM) なるAI風のチャットアプリを利用することであろう。
GPTにしろGeminiにしろ,ANSI Common Lispでhello, worldと表示する方法を教えて!とか質問を投げれば直ちに解答が得られることであろう。
また,Lispの入門コースを立案して,みたいな相談も快く受け付けてくれるであろう。
ただし,実際のLisp入門講義をお願いしたり,参考になりそうなサイトや文献の案内まで任せる際には注意が必要である。ヤツら (LLM) はそういう情報をこちらに提供する際,平然と虚偽の情報を混ぜてくるからである。ユーザーに害を成そうと悪意を持ってそのような振る舞いをするわけではないのだろうが,本当に息をするような自然さでサラっと大ウソをかましてくるから全く油断ならない。
今のところ私が目を付けているのは国立国会図書館デジタルコレクションにメールアドレスなどのいくばくかの個人情報を含めて利用者登録することで利用可能になる,「送信サービスで閲覧可能」になっている,湯浅太一・萩谷昌己共著の『Common Lisp入門』(岩波書店,1986年)である。
とはいえ,先ほど述べたように,なんだかんだLLMに教わった内容も絡めていくかもしれない。けれども,ヤツらの言うことは本当に信用ならないので,やはりプロが書いた入門書などで裏を取った情報しかこのようなブログに流せないという認識は持ち続けるつもりである。
標準的な解答
湯浅・萩谷『Common Lisp入門』「10.3 文字と文字列」によると,文字列はダブルクォート " " で囲むものらしい。
というわけで,
"hello, world"
と入力してC-Enterすると,全くそのままの文字列
"hello, world"
が返ってくる。これがLispにおける標準的なhello, worldプログラムであろう。
次回のミッション
すぐ解決しそうだが,累乗の組込み関数があるのかどうか,それを知りたい。
→すぐ解決した。湯浅・萩谷『Common Lisp入門』「10.1 数値」で
(expt 2 3)
のようにすれば,C-Enterで2の3乗である8が返る。