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-04-17

突発性CL勉強会

| 20:02 | 突発性CL勉強会 - わだばLisperになる を含むブックマーク はてなブックマーク - 突発性CL勉強会 - わだばLisperになる

「なんだか、最近CLが流行ってるらしいよ。色んなところで勉強会もあるみたいだし…」という風説を流布するため、突発的ですがCLの勉強会を呼び掛けてみることにしました!

人も集まらないだろうし、一回ごとに完結できるテーマの方が良いだろうということで、

  1. Edi Weitz氏のTHE POWER OF LISP MACROS
  2. Peter Norvig、Kent Pitman両氏のTutorial on Good Lisp Programming Style(日本語訳あり)
  3. The Common Lisp Cookbookの中のFundamentals of CLOS(日本語訳CLクックブックさん)
  4. ASDFの設定、使い方〜周辺ユーティリティついてとASDFインストール可能な簡単なプロジェクトの作成方法。
  5. FORMATか、LOOPマクロをマスターする
  6. SLIMEって便利だよ
  7. 数理システムさんの「Common Lisp における例外処理 〜Condition System の活用〜」

のどれか一つ位を教材にすることを考えていて、私を含めて定員は3名。参加条件としては、勉強会の内容をできるだけ詳細にブログに書くこと(読んだ人が勉強会に参加する必要がない位の詳細さがベスト)としたいと思います。

日時は、今週か来週の土曜日で、場所は、渋谷、新宿、世田谷区のどこか集まれそうな場所等を考えています。

参加しても良いよ!という方は、このエントリにコメント頂ければと思います。

誰も集まらない場合、1人3役でキャラ設定をしつつ私が喫茶店とかで勉強します!

GOOでL-99 (P12 ランレングス圧縮の伸長)

| 17:45 | GOOでL-99 (P12 ランレングス圧縮の伸長) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P12 ランレングス圧縮の伸長) - わだばLisperになる

何となくDylanの書法を真似て書いてみました。DGは、CLのdefgeneric、Dylanのdefine genericです。

generic系で、対応するクラスと返り値のクラスを明示→個別をmethod系で定義、というのは、CLOS系では割と定番なのかもしれません。

GOOでは、let(def)は、タプルを指定することによって分割代入的なことが可能なので使ってみました。

それと、letはCL/Schemeでいうlet*なので若干注意が必要かもしれません。パラレルにしたい場合は、前述のタプルを使った方法で書く必要があります。

opfは、Arcのzap、TAOの!!のようなもので自己代入の書法です。(set x (op + _ 1) ) => (opf x (+ _ 1) )と書けます。

(decode '((4 a) (1 b) (2 c) (2 a) (1 d) (4 e)))
;=> (a a a a b c c a a d e e e e)
(decode #((4 a) (1 b) (2 c) (2 a) (1 d) (4 e)))
;=> #(a a a a b c c a a d e e e e)
(decode #[(4 a) (1 b) (2 c) (2 a) (1 d) (4 e)])
;=> #[a a a a b c c a a d e e e e]
(decode "4;a,1;b,2;c,2;a,1;d,4;e")
;=> "aaaabccaadeeee"

(dg decode (u|<seq> => <seq>))

(dm decode (u|<seq> => <seq>)
  (def res () )
  (for ((item u))
    (def (tup n item) item)
    (opf res (cat _ (repeat `(,item) n))))
  (as (class-of u) res))

(dm decode (u|<str> => <str>)
  (let ((res "")
        (items (split u #\,)))
    (for ((x items))
      (def (tup n item) (split x #\;))
      (opf res (cat _ (repeat item (str-to-num n)))))
    res))

Getting Started in *LISP (5)

| 15:35 | Getting Started in *LISP (5) - わだばLisperになる を含むブックマーク はてなブックマーク - Getting Started in *LISP (5) - わだばLisperになる

実に2ヶ月も間が空いてしまいました…。

もう、自分自身すっかり忘れてしまっていますが、

Getting Started in StarLispという*LISPのチュートリアルの実習をしています。

とりあえず、毎週木曜日には、このシリーズでエントリを書くことにしました。

1.2.4 Mortal or Immortal

前回までは、ムーア型とノイマン型のオートマトンを作成して様子を観察していましたが、今回は、それぞれ絶滅するパターンはあるか?を探るようです。

どうやって集計するかですが、*LISPには、*SUMというpvarの数を集計してくれる関数があるので、それを使います。

(*sum (signum!! *automata-grid*))

SIMD版signumで、0、1、-1に割り振って集計というわけですね。-1はありえないので、個体数を勘定するのに使えます。

それで、それをユーティリティとして定義してみます。

(defun deadp ()
  (zerop (*sum (signum!! *automata-grid*))))

これで、絶滅したかを確認することができます。ここで、zeropと、zerop!!の使い分けについての説明があります。

今回の場合、*sumは、PVARを返すわけではなく、スカラー値を返すので、zeropを使うのが適切とのこと。

これらを使って絶滅するパターンを探ってみよう、という感じです。

次回は、1.2.5からです。