ANSI Common Lisp Helloの開発
たまにはバカな投稿でもします。
今日はエイプリールフールじゃないんだぞ、ということでちゃんと開発はしますよ。
npt
のソースコードを使って、あなただけのCommon Lispを作りましょう。
npt
は名前が変更されることを前提として開発されています。
名前を表すnpt
という文字は、たった1つのヘッダーファイルにしか現れません。
grep
で確認してみます。
$ grep -i npt src/* test/* src/version.h:#define LISPNAME "NPT" src/version.h:#define LISPNAMEW L"NPT" src/version.h:#define LispName "Npt" src/version.h:#define LispNameW L"Npt" src/version.h:#define Lispname "npt" src/version.h:#define LispnameW L"npt"
つまりこのファイルを変更すれば、
ANSI Common Lisp Helloが作成できるということです。
さっそく言い訳をしますが、C言語のソース以外のファイルの、
例えばMakefile
なんかには
npt
という文字が直打ちされていますので使えません。
そこはゆるして。
ではANSI Common Lisp Helloを作ってみましょう。
まずはgithubからnpt
のソースを持ってきて下さい。
変更するファイルはsrc/version.h
です。
変更後のsrc/version.h
#define LISPNAME "HELLO" #define LISPNAMEW L"HELLO" #define LispName "Hello" #define LispNameW L"Hello" #define Lispname "hello" #define LispnameW L"hello" #define LISPNAMESIZE 5 #define LISP_REVISION "2020/06/30-19:33:14" #define LISP_VERSION_A 1 #define LISP_VERSION_B 0 #define LISP_VERSION_C 0
修正は難しくないと思います。
LISPNAMESIZE
には文字数を入れて下さい。
名前はアルファベットだけでお願いします。
Unicodeとか入れてもたぶん無理です。
では作成します。
FreeBSDでやってみます。
$ cc -o hello src/*.c \ -DLISP_FREEBSD -DLISP_PROMPT_EDITLINE -DLISP_MODE_STANDALONE \ -O3 -lm -ledit -Isrc -Itest
Linuxだとこんな感じ。
$ cc -o hello src/*.c \ -DLISP_LINUX -DLISP_PROMPT_READLINE -DLISP_MODE_STANDALONE \ -O3 -lm -lreadline -Isrc -Itest
コンパイルがうまく行ったら、テストケースを実行します。
$ ./hello --script test/rt.lisp ... OK.
これで完了!
いろいろと実行してみましょう。
$ ./hello --version hello Version 1.0.0 ----- Memory size 64bit Fixnum size 64bit Lisp mode FreeBSD Thread mode remove Version 1.0.0 Build information 2020/06/30-19:33:14 ----- Execute mode standalone Release mode release Degrade mode release Prompt mode editline -----
名前がhello
になっているのが分かります。
$ ./hello --help hello -- ANSI Common Lisp Programming Language. USAGE: hello [options] [inputs] [--] [arguments] OPTIONS: ・・・
こちらもhello
になっています。
他にnpt
との違いはどこになるでしょうか?
記憶にある限りだと、package
の名前とlisp-implementation-type
関数です。
package
を確認をしてみます。
$ ./hello * (list-all-packages) (#<PACKAGE HELLO> #<PACKAGE COMMON-LISP-USER> #<PACKAGE COMMON-LISP> #<PACKAGE HELLO-SYSTEM> #<PACKAGE HELLO-USER> #<PACKAGE HELLO-CODE> #<PACKAGE KEYWORD> #<PACKAGE HELLO-CLOS> #<PACKAGE HELLO-RT>)
続いてlisp-implementation-type
関数も確認します。
* (lisp-implementation-type) "HELLO"
変更されていますね。
これでANSI Common Lisp Helloの開発は完了です。
今回は通常のソースを用いましたが、amalgamation
も同じです。
lisp.c
の先頭の方にversion.h
が埋め込まれているので変更してください。