ACL express から modern CL をビルドする

Lisp では英数字子文字は使えない、と間違って記憶している方がいます。すでに述べたようにシンボルの文字実装はUNICORDですから英子文字のシンボルだって使えます。以下の例をご覧ください。最初は ACL alisp (ANSI lisp) の場合、2番目が ACL mlisp (modern lisp) の場合です。

seiji@agents:~$ acl/alisp
International Allegro CL Enterprise Edition
10.1 [64-bit Linux (x86-64)] (Oct 8, 2023 22:02)
Copyright (C) 1985-2017, Franz Inc., Oakland, CA, USA. All Rights Reserved.

This development copy of Allegro CL is licensed to:
   [TC20412] National Institute of Informatics (NII)

;; Optimization settings: safety 1, space 1, speed 1, debug 2.
;; For a complete description of all compiler switches given the
;; current optimization settings evaluate (EXPLAIN-COMPILER-SETTINGS).
CL-USER(1): (defpackage "rdf" (:export "type"))
#<The rdf package>
CL-USER(2): (setq |rdf|:|type| 'foo)
FOO
CL-USER(3): |rdf|:|type|
FOO
CL-USER(4):
seiji@agents:~$ acl/mlisp
International Allegro CL Enterprise Edition
10.1 [64-bit Linux (x86-64)] (Oct 8, 2023 22:02)
Copyright (C) 1985-2017, Franz Inc., Oakland, CA, USA.  All Rights Reserved.

This development copy of Allegro CL is licensed to:
   [TC20412] National Institute of Informatics (NII)

;; Optimization settings: safety 1, space 1, speed 1, debug 2.
;; For a complete description of all compiler switches given the
;; current optimization settings evaluate (explain-compiler-settings).
;;---
;; Current reader case mode: :case-sensitive-lower
cl-user(1): (defpackage "rdf" (:export "type"))
#<The rdf package>
cl-user(2): (setq rdf:type 'foo)
foo
cl-user(3): rdf:type 
foo
cl-user(4): 

両方とも defpackage の定義部分は同じですが、alispでは小文字を縦棒で括らなければならないこと、mlispでは括らなくてもよいことが分かります。alisp では小文字 foo が大文字に変換されていること、REPLプロンプトが大文字であることにも注意願います。

このように alisp では小文字で入力しても自動的に大文字に変換されてしまいます。これを避けるには小文字にしたいシンボルを縦棒で括ればよいのですが、これが大量になると、面倒だしとても見にくい。ここまでは ACL に限らず、どんな Common Lisp でも共通の話です。対してFranz社は小文字をそのままシンボルとして扱うことのできる modern Lisp (mlisp) を提供しています。ACL 商用版を購入すると、小文字を大文字に変換する ANSI Lisp (IDEなし)と、変換しない mlisp (IDEなし)と、それらのIDE付きが提供されるのですが、express ではIDE付きANSI Lisp (express-Allegro) とIDEなしANSI Lisp (express-alisp)が提供されても、mlisp は提供されず、必要なら各自でリビルドせよ、ということになっています。Franz社曰く、mlisp 開発の動機はウェブ開発にあるそうですから、我々もここで mlisp のIDEありとなしのACLを作成して以後はIDE付き mlisp を使うようにします。

次のコードをコピーして適当なファイル名をつけてどこかになくさないように保存しておいてください。これはただ単にREPLのペインに直接ペーストできないので、いったんエディターファイルに取り込むためだけのものです。

 ;; allegro
(progn
  (build-lisp-image "sys:allegro.dxl" :case-mode :case-sensitive-lower 
                    :include-ide t :restart-app-function nil)
              (when (probe-file "sys:allegro") (delete-file "sys:allegro"))
              (sys:copy-file "sys:allegro-express" "sys:allegro"))
              
;; mlisp:
(progn
  (build-lisp-image "sys:mlisp.dxl" :case-mode :case-sensitive-lower
                    :include-ide nil :restart-app-function nil)
  (when (probe-file "sys:mlisp") (delete-file "sys:mlisp"))
  (sys:copy-file "sys:alisp" "sys:mlisp"))

このコードは使用中の Lisp イメージ(allegro の場合は allegro-express.dxl、mlisp の場合はalisp.dxl )を :case-mode :case-sensitive-lower で allegro の場合は IDE まで含めて、mlisp の場合は含めずにダンプして、allegro.dxl あるいは mlisp.dxl という名前にし、同時にそのためのスクリプトファイルをコピーして作るものです。

それでは最初に allegro の場合、allegro-express を立ち上げて、メニューから<file>=><open>と選択し、さきほどのコピペで保存したファイルをオープンします。

次に allegro の場合のコードを再びコピーして、REPL上に張り付けて実行します。最後にTが返されたら終了ですから:exitで終わります

International Allegro CL Free Express Edition
11.0 [64-bit Linux (x86-64)]
Copyright (C) 1985-2023, Franz Inc., Lafayette, CA, USA.  All Rights Reserved.

This development copy of Allegro CL is licensed to:
   Allegro CL 11.0 Express user

Loaded options from /home/seiji/.allegro.d/.allegro-ide-options.cl.

;; Optimization settings: safety 1, space 1, speed 1, debug 2, compilation-speed 1.
;; For a complete description of all compiler switches given the current optimization settings evaluate (EXPLAIN-COMPILER-SETTINGS).

[changing package from "COMMON-LISP-USER" to "COMMON-GRAPHICS-USER"]
CG-USER(1): 
; Fast loading from bundle code/ef-e-anynl.fasl.
;   Fast loading from bundle code/ef-e-crlf.fasl.
;   Fast loading from bundle code/ef-e-cr.fasl.
; Fast loading from bundle code/ef-e-crcrlf.fasl.

CG-USER(1): (progn
  (build-lisp-image "sys:allegro.dxl" :case-mode :case-sensitive-lower 
                    :include-ide t :restart-app-function nil)
              (when (probe-file "sys:allegro") (delete-file "sys:allegro"))
              (sys:copy-file "sys:allegro-express" "sys:allegro"))
T
CG-USER(2): :exit

shellに戻ったら今度は作ったばかりの allegroを起動します。

$ acl11.0exprss.64/allegro

このような小文字プロンプトが表示されれば成功です。

alisp から mlisp を作る場合はわざわざファイル経由しなくても、直接REPLにコピペして実行すればよい。

seiji@agents:~$ acl11.0express.64/alisp
International Allegro CL Free Express Edition
11.0 [64-bit Linux (x86-64)]
Copyright (C) 1985-2023, Franz Inc., Lafayette, CA, USA.  All Rights Reserved.

This development copy of Allegro CL is licensed to:
   Allegro CL 11.0 Express user

;; Optimization settings: safety 1, space 1, speed 1, debug 2,
;; compilation-speed 1.
;; For a complete description of all compiler switches given the
;; current optimization settings evaluate (EXPLAIN-COMPILER-SETTINGS).
CL-USER(1): (progn
  (build-lisp-image "sys:mlisp.dxl" :case-mode :case-sensitive-lower
                    :include-ide nil :restart-app-function nil)
  (when (probe-file "sys:mlisp") (delete-file "sys:mlisp"))
  (sys:copy-file "sys:alisp" "sys:mlisp"))
; Autoloading for BUILD-LISP-IMAGE:
; Fast loading from bundle code/build.fasl.
Initial generation spread = 1
Allocated 62914560 bytes for old space
Allocated 62914560 bytes for code-vector space
Allocated 5242880 bytes for new space
Startup space usage:  Old=17k, New=248k
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;


; Autoloading for package "multiprocessing":
; Fast loading from bundle code/proc2-s.fasl.
; Fast loading from bundle code/proc2common.fasl.
International Allegro CL Free Express Edition
11.0 [64-bit Linux (x86-64)]
Copyright (C) 1985-2023, Franz Inc., Lafayette, CA, USA.  All Rights Reserved.

This development copy of Allegro CL is licensed to:
   Allegro CL 11.0 Express user

Note: Allegro CL will expire in 528 days, on June 14, 2025.

省略

; Initial Lisp Listener will be killing processes: 
;; processes killed
; Exiting
T
CL-USER(2): :exit
; Initial Lisp Listener will be killing processes: 
;; processes killed
; Exiting
seiji@agents:~$ acl11.0express.64/mlisp
International Allegro CL Free Express Edition
11.0 [64-bit Linux (x86-64)]
Copyright (C) 1985-2023, Franz Inc., Lafayette, CA, USA.  All Rights Reserved.

This development copy of Allegro CL is licensed to:
   Allegro CL 11.0 Express user

;; Optimization settings: safety 1, space 1, speed 1, debug 2,
;; compilation-speed 1.
;; For a complete description of all compiler switches given the
;; current optimization settings evaluate (explain-compiler-settings).
;;---
;; Current reader case mode: :case-sensitive-lower
cl-user(1): (defpackage rdf (:export type))
#
cl-user(2): (setq rdf:type 'foo)
foo
cl-user(3): rdf:type
foo
cl-user(4):