Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-01-04

お題: ポーカーの役判定

| 01:21 | お題: ポーカーの役判定 - わだばLisperになる を含むブックマーク はてなブックマーク - お題: ポーカーの役判定 - わだばLisperになる

とりあえず新しいお題が出題されたので挑戦。

毎度ながらノープランで書き始め、なんとか完成。

コピペミスで古いバージョンをアップしてしまい修正。

Slimeだと開発が対話的で便利過ぎるのかLispのコアイメージの中の環境とファイルのソースに書かれた内容が食い違うことも発生しがちなので、提出の際には一旦コードを素の状態からロードさせて正しく動作するか確認するようにしないといけないな、と改めて思ったり。

しかし、多分、私は、Slimeの支援なしでは、何一つ書けないんだろうなと思う。

ちょっと書いて、直してコンパイル、コンパイラに怒られて、直してコンパイル、〜という感じで、コンパイラが指摘してくれないと、どこにも辿り着けない(´▽`*)

PAIP読書会

| 00:50 | PAIP読書会 - わだばLisperになる を含むブックマーク はてなブックマーク - PAIP読書会 - わだばLisperになる

PAIP読書会が開催されることになったとのことで、早速PAIPを持ってない私もメーリングリストにだけは、登録してみたのですが、告知メールが今日届きました。

--

「Paradigms of Artificial Intelligence Programming:

Case Studies in Common Lisp」

by Peter Norvig

の読書会を開催します。とりあえず第1回を下記の日程と場所で実施し、

そこでいろいろ相談しながら、ゆる~くやり方を決めていきたいと考え

ています。

日時: 2008年1月12日(土) 13:00~18:00

場所: 株式会社タイムインターメディア2F大会議室

東京都新宿区坂町26-27 インテリジェントプラザビル 2F

参加費: 無料

参加条件: 特にありませんが、上記の本とCommon Lisp処理系をインストールした

ノートパソコンを持参することをお薦めします。

その他: 持ち込みネタ(PAIP本に関わる発表とかデモとか大歓迎です。)

質問や提案があれば、WiLiKiのページかこのメーリングリスト、あるいはLingrのGauche部屋に流してもらえるとありがたいです。

また、この告知自体の転載を歓迎します。

--

とのことで、参加しようかどうか悩んでいます。PAIP持ってないしな〜。

この本の中のコードは、公開されてるから、それとPCを持参すれば少しはましかな、うーん。

まあ、速攻PAIP買えよって話なんですけど、この本自分にはちょっと難易度が高すぎるんじゃないかなと思いまして。やっぱり、とりあえず様子見かな(笑)

Practical Common Lisp (20)

| 00:16 | Practical Common Lisp (20) - わだばLisperになる を含むブックマーク はてなブックマーク - Practical Common Lisp (20) - わだばLisperになる

Practical Common Lisp 第5章5. Functionsを読んでメモしてみています。

Optional Parameters

オプショナルパラメータの話

  • 全部の関数が予め決められた数の引数を扱うなら良いが実際的には、例えば、パラメータに初期値が設定されていて、呼び出し時にもし必要な場合、パラメータを指定したりできると便利。
  • そういうときには、&OPTIONALが使える。
(defun foo (a b &optional c d) (list a b c d))
  • 上記の場合、&optionalより前のaとbは必須パラメータとなり、それより後は、オプショナルになる。
  • 呼び出し時にオプショナル引数に値を渡さないとNILで初期化してくれる。
(foo 1 2)     ==> (1 2 NIL NIL)
(foo 1 2 3)   ==> (1 2 3 NIL)
(foo 1 2 3 4) ==> (1 2 3 4)
  • NILで初期化するのは分かったが、他の値で初期化して欲しい場合、明示的に指定する方法があり、(変数名 初期値)という風にリストにして記述する
(defun foo (a &optional (b 10)) (list a b))

(foo 1 2) ==> (1 2)
(foo 1)   ==> (1 10)
  • 引数の値を他の引数から算出して設定したい場合もある。例えば、矩形を描く関数を定義するとして、基本的にデフォルトは正方形を描くものとし、高さは、明示的に与えられない限り、幅から算出されるとしたい。その場合、先に決定した値を後方で参照して初期値として使用することができる。
(defun make-rectangle (width &optional (height width)) ...)
  • 偶に、引数が明示的に与えられたのか、それとも初期値が使われたのかを判別したい場合がある。その場合には、(変数名 初期値 指定されたかどうかを判別する変数名)という形式で記述する。
(defun foo (a b &optional (c 3 c-supplied-p))
  (list a b c c-supplied-p))

なんとなく演習

(defun オプショナルな気分 (&optional (ans nil))
  (print
   (if ans
       "オプショナルな気分なんですね?"
       "オプショナルな気分ではないのすね?")))

(オプショナルな気分 nil)
"オプショナルな気分ではないのですね?" 

(オプショナルな気分)
"オプショナルな気分ではないのですね?" 
;; いや、そういうわけではないのだが…。

;; 上の定義では、区別が付かないので改善
(defun オプショナルな気分 (&optional (ans nil ans-supplied-p))
  (print 
   (cond ((and ans-supplied-p (not ans)) "オプショナルな気分ではないのですね?")
	 (ans "オプショナルな気分なんですね?")
	 ('T "なんともいえないのですね?"))))

(オプショナルな気分 nil)
"オプショナルな気分ではないのですね?" 

(オプショナルな気分)
"なんともいえないのですね?" 
;; いや、そういうわけでもないのだが…。

--

質問に答えること自体は任意で、否定したい場合は、NILで答えるとした場合、オプショナル引数を省略したためにデフォルト値のNILが渡って来たのか、それとも明示的にNILで答えられたのか区別できないので、supplied-pを利用するという無理矢理なケースを捏造してみる。