Clisp事始め

というわけでCommon Lispを始めてみたりする。ものはubuntuにaptで入れた2.44.1。
とりあえず、以下の本を手元に置いて防壁を構築。ハッキングを開始する。

Structure and Interpretation of Computer Programs (MIT Electrical Engineering and Computer Science)
プログラミングGauche

  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.44.1 (2008-02-23) <http://clisp.cons.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-2008

Type :h and hit Enter for context help.

まあ、とわいえ、、、基本的には同じなんだろうなー.
まずは基本。普通のことは普通にできる。僕はelispからMIT記法(schemeのdefine)と進んだタイプなので、むしろdefunにそんなに抵抗はない(そもそもlambdaとdefine-funcで違っているのは考えてみれば変なのかも)。
名前空間は関数と変数で分かれてるのか。

[12]> (defun hoge (x) (* x x))
HOGE
[13]> (setq hoge 99)
99
[14]> (hoge hoge)
9801

んー。Emacsの幻影が見える。ひょっとして、、、

[22]> (symbol-value 'hoge)
99
[23]> (symbol-function 'hoge)
#<FUNCTION HOGE (X) (DECLARE (SYSTEM::IN-DEFUN HOGE)) (BLOCK HOGE (* X X))>

あ、やっぱり。
ふーん、なんかdeclareとかあるのは pragmaみたいなもんなのかな。そういえばLOLの中にも declare optimizeとかあったなあ。で、BLOCKなのね、lambda。
んで、基礎の基礎。終わり方。(quit)か(exit)で終了。どう違うんだろう?
どんどん潜行してみよ。
TABを押したら補完。んで、すごい、二回押したらヘルプが出た!

[11]> (app
appease-cerrors  append           apply            applyhook        
[11]> (append 

APPEND is the symbol APPEND, lies in #<PACKAGE COMMON-LISP>, is accessible in 16 packages ASDF, BDB, CLOS,
COMMON-LISP, COMMON-LISP-CONTROLLER, COMMON-LISP-USER, EXPORTING, EXT, FFI, POSIX, READLINE, REGEXP, SCREEN,
SYSTEM, XLIB, XPM, names a function, has 1 property CLOS::%METHOD-COMBINATION.
For more information, evaluate (SYMBOL-PLIST 'APPEND).

 #<PACKAGE COMMON-LISP> is the package named COMMON-LISP. It has 2 nicknames LISP, CL.
 It imports the external symbols of 1 package CLOS and exports 978 symbols to 15 packages ASDF,
 COMMON-LISP-CONTROLLER, BDB, XLIB, XPM, READLINE, REGEXP, POSIX, EXPORTING, FFI, SCREEN, CLOS,
 COMMON-LISP-USER, EXT, SYSTEM.

 #<SYSTEM-FUNCTION APPEND> is a built-in system function.
 Argument list: (&REST SYSTEM::OTHER-ARGS)
 For more information, evaluate (DISASSEMBLE #'APPEND).

うわー なんというアドレナリンブースト。
エラーが出る度に状態遷移してしまうのはちょっとうっとーしー。エラーを帳消しにできるのはおいしいけれども。

[4]> (disassemble #'princ )
0x00007fcd608a0a8e in waitpid () from /lib/libc.so.6
0x000000000050831e <C_princ+0>:	sub    $0x8,%rsp
0x0000000000508322 <C_princ+4>:	mov    0x3b53a7(%rip),%rdi        # 0x8bd6d0 <STACK>
0x0000000000508329 <C_princ+11>:	sub    $0x8,%rdi
0x000000000050832d <C_princ+15>:	callq  0x506f02
0x0000000000508332 <C_princ+20>:	callq  0x4f8bc0
0x0000000000508337 <C_princ+25>:	mov    0x3b5392(%rip),%rax        # 0x8bd6d0 <STACK>
0x000000000050833e <C_princ+32>:	sub    $0x10,%rax
0x0000000000508342 <C_princ+36>:	mov    %rax,0x3b5387(%rip)        # 0x8bd6d0 <STACK>
0x0000000000508349 <C_princ+43>:	mov    (%rax),%rax
0x000000000050834c <C_princ+46>:	mov    %rax,0x3b544d(%rip)        # 0x8bd7a0 <mv_space>
0x0000000000508353 <C_princ+53>:	movl   $0x1,0x3b5423(%rip)        # 0x8bd780 <mv_count>
0x000000000050835d <C_princ+63>:	add    $0x8,%rsp
0x0000000000508361 <C_princ+67>:	retq   
NIL

わーわーわー

[10]> (disassemble #'hoge)

Disassembly of function HOGE
1 required argument
0 optional arguments
No rest parameter
No keyword parameters
4 byte-code instructions:
0     (LOAD&PUSH 1)
1     (LOAD&PUSH 2)
2     (CALLSR 2 55)                       ; *
5     (SKIP&RET 2)
NIL

わうわううううわわわーーー。

もうダメ。この環境気持ちよすぎる。