nptclのブログ

Common Lisp処理系nptの開発メモです。https://github.com/nptcl/npt

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が埋め込まれているので変更してください。