Common Lispを触る(CLISP)
先日『ハッカーと画家』を読みLispに少し興味が湧いたので、Common Lispの処理系を導入してみた。
- 作者: ポールグレアム,Paul Graham,川合史朗
- 出版社/メーカー: オーム社
- 発売日: 2005/01/01
- メディア: 単行本
- 購入: 109人 クリック: 4,884回
- この商品を含むブログ (582件) を見る
CLISP
Common Lispの処理系はSBCL、LispWorksなど色々あるようだが、ここでは構築が簡単そうなCLISPを導入する。
Ubuntuではaptでインストールできる(Ubuntu 18.04 LTSで実施)。
$ sudo apt install clisp
余談だが、Cygwinでも導入できるため、Windowsでも環境構築が簡単らしい。
REPL
$ clisp
で対話環境であるREPL (Read-Eval-Print-Loop) が起動する。
$ clisp i i i i i i i ooooo o ooooooo ooooo ooooo I I I I I I I 8 8 8 8 8 o 8 8 I \ `+' / I 8 8 8 8 8 8 \ `-+-' / 8 8 8 ooooo 8oooo `-__|__-' 8 8 8 8 8 | 8 o 8 8 o 8 8 ------+------ ooooo 8oooooo ooo8ooo ooooo 8 Welcome to GNU CLISP 2.49.60+ (2017-06-25) <http://clisp.org/> Copyright (c) Bruno Haible, Michael Stoll 1992, 1993 Copyright (c) Bruno Haible, Marcus Daniels 1994-1997 Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998 Copyright (c) Bruno Haible, Sam Steingold 1999-2000 Copyright (c) Sam Steingold, Bruno Haible 2001-2010 Type :h and hit Enter for context help. [1]>
Hello worldは例えば次のようになる。
[1]> (format t "hello, world") hello, world NIL [2]>
スクリプト実行
$ clisp [lisp-file]
の形で、引数にスクリプトファイルを指定し実行できる。
$ echo '(format t "hello, world")' > helloworld.lisp $ clisp helloworld.lisp hello, world
また、shebangを設定し実行権限を付加すれば、スクリプトファイル単体で実行できる。
$ cat << EOF > helloworld_scpt.lisp > #!/usr/bin/clisp > (format t "hello, world") > EOF $ chmod a+x helloworld_scpt.lisp $ ./helloworld_scpt.lisp hello, world
コンパイルと実行
$ clisp -c [lisp-file]
でスクリプトファイルをバイトコードへコンパイルし、高速な実行が可能となる。
$ clisp -c helloworld.lisp (略) ;; Compiling file ~/helloworld.lisp ... ;; Wrote file ~/lisp/helloworld.fas 0 errors, 0 warnings Bye.
コンパイル後のバイトコードとして*.fas
が、コンパイル時情報として*.lib
が出力される。
$ ls
helloworld.fas helloworld.lib helloworld.lisp
$ clisp [bytecode]
でプログラムを実行する。
$ clisp helloworld.fas hello, world
また、REPLを起動しcompile-file
関数を呼ぶことでもコンパイルが可能。
$ clisp (略) [1]> (compile-file "helloworld.lisp") ;; Compiling file ~/helloworld.lisp ... ;; Wrote file ~/helloworld.fas 0 errors, 0 warnings #P"~/helloworld.fas" ; NIL ; NIL
バイトコードはプラットフォームに依存しない中間表現で、実行速度はネイティブコードに劣るが移植性が高いのが利点。