気が向いたら書くやつ

気が向いたら何か書きます

Common Lispを触る(CLISP)

先日『ハッカーと画家』を読みLispに少し興味が湧いたので、Common Lispの処理系を導入してみた。

ハッカーと画家 コンピュータ時代の創造者たち

ハッカーと画家 コンピュータ時代の創造者たち

CLISP

Common Lispの処理系はSBCLLispWorksなど色々あるようだが、ここでは構築が簡単そうなCLISPを導入する。

clisp.sourceforge.io

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

バイトコードはプラットフォームに依存しない中間表現で、実行速度はネイティブコードに劣るが移植性が高いのが利点。

参考

qiita.com

sites.google.com