関数もしくはlambda式の引数(ラムダリスト)定義について。
> (defun func (x y)
(list x y))
> (func 1 2)
(1 2)
b,cはオプションなので引数として与えても与えなくてもいい。
引数として与えない場合にはデフォルト値として下記で設定したb=3, c=5の
値が使われる。
> (defun func (a &optional (b 3) (c 5))
(list a b c))
> (func 1)
(1 3 5)
> (func 1 5)
(1 5 5)
pythonでいうと、:
>>> def func(a, b=3, c=5):
... print a, b, c
>>> func(1)
1 3 5
>>> func(1,5)
1 5 5
みたいなの。引数を定義した位置が重要。
Continue Reading...: "CLISPの勉強 (ラムダパラメータリスト編)"
オンライン書店ビーケーワン:プログラマの数学
買ってみました。
まだ最後まで読めてないけど、内容としては理系の人なら学生時代に習った内容ばかりですが、すっかり忘れてしまっているものとか、実際にプログラムと関連付けて考えれていないものとか結構あってなかなか楽しめています。
- ド・モルガンの法則なんて、すっかり忘れてました。当然if/elseとか考えるときにはむ意識で考えてはいたんでしょうけれども、明示的にこの考えを使ったほうが楽に変換できますね。
- 順列やら組み合わせも、学生時代にやったなーと思いながらもちゃんとは覚えていませんでした。
- 再帰の項であったハノイの塔の説明がすごく良かった。これまでにもハノイの解説は読んだんだけど今ひとつすっきりわかっていなかったのが、この説明ですっきり!Lispで書くとこんな感じ。
;; hanoi(from, via, to, number)
(defun hanoi (x y z num)
(if (= num 0)
0
(progn
(hanoi x z y (1- num))
(format t "~A: ~A -> ~A~%" num x z)
(hanoi y x z (1- num)))))
(hanoi "A" "B" "C" 3)
1: A -> C
2: A -> B
1: C -> B
3: A -> C
1: B -> A
2: B -> C
1: A -> C
買う前は、いまさらわざわざ数学の勉強しなくてもって思ってたけど、すごくおもしろかった。頭の体操にいいです。
最近、 CLISP を勉強しているのですが、なかなか資料が少なくて苦戦しております。
で、今日やっとシェルからスクリプトを起動する場合のパラメータの渡し方がわかったのでメモ。
#!/usr/bin/env clisp
;; my-main.lisp
(defun main ()
(print *args*))
(main)
で、コマンドラインからこのようにする、と
$> clisp my-main.lisp hoge 8 0 12
("hoge" "8" "0" "12")
となるので、*args*にはコマンドラインで指定した引数がリストとして保持されているので、後は煮るなり焼くなり好きにしたらいいよっということです。
Continue Reading...: "CLISP勉強中"