Sat, 01 Oct 2005

CLISPの勉強 (ラムダパラメータリスト編)

関数もしくはlambda式の引数(ラムダリスト)定義について。

通常 (必須パラメータ)

> (defun func (x y)
      (list x y))
> (func 1 2)
(1 2)

optional

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の勉強 (ラムダパラメータリスト編)"



Fri, 23 Sep 2005

PythonとCLISPの対応、及びCLISPの文字コードの話

Pythonですら、日本語ドキュメントが少ないと言われているけれども、 CLISPでは、それをはるかに上回って(下回って)日本語のドキュメントがないので、 実現したい機能に対応する関数を見つけるのに非常に苦労します。

新山さんによって訳された、 Lisp プログラマのための Python 人門 は、 本文にも書かれているように、PythonプログラマがLispを学ぶのにも良いのですが、 ここに書かれている以外で見つけた関数をメモとしてPythonとの対比で書いておきます。

ちょっとだけですが。


Continue Reading...: "PythonとCLISPの対応、及びCLISPの文字コードの話"



Wed, 21 Sep 2005

プログラマの数学とハノイの塔

book オンライン書店ビーケーワン:プログラマの数学

買ってみました。

まだ最後まで読めてないけど、内容としては理系の人なら学生時代に習った内容ばかりですが、すっかり忘れてしまっているものとか、実際にプログラムと関連付けて考えれていないものとか結構あってなかなか楽しめています。

  • ド・モルガンの法則なんて、すっかり忘れてました。当然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

買う前は、いまさらわざわざ数学の勉強しなくてもって思ってたけど、すごくおもしろかった。頭の体操にいいです。


Sat, 17 Sep 2005

CLISP勉強中

最近、 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勉強中"