Clisp事始め
というわけでCommon Lispを始めてみたりする。ものはubuntuにaptで入れた2.44.1。
とりあえず、以下の本を手元に置いて防壁を構築。ハッキングを開始する。
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
わうわううううわわわーーー。
もうダメ。この環境気持ちよすぎる。