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-02-10

Getting Started in *LISP (4)

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

*LISPのチュートリアルをさらってみることの4回目。

大分間があいてしまいました‥。

特に理由はないけれどこのチュートリアルは終らせたいところ。

1.2.3 Defining a More Complex Automaton

の続きで、One Small Step...for 9 Life

(defun one-step ()
  (*let ((count (neighbor-count)))
    (cond!!
      ;; 周囲の数が<1か、>3なら、1を引く
      ((or!! (<!! count 1) (>!! count 3))
       (if!! (zerop!! *automata-grid*)
	     *automata-grid*
	     (1-!! *automata-grid*)))

      ;; 2か、3なら1を足す
      ((<=!! 2 count 3) (1+!! *automata-grid*))

      ;; その他は、そのまま
      (t *automata-grid*))))

オートマトンの状態を一段階ずつ進める関数を定義

cond!!と、if!!は、pvarそれぞれを判定して結果を返す、SIMD版condとif

他にも色々ユーティリティを定義

(defun set-cells (cell-list value)
  (dolist (cell cell-list)
    (set-cell (car cell) (cadr cell) value)))

(defun init ()
  (set-grid 0)
  (set-cells '((2 2) (3 1) (3 2) (3 3) (4 1))
	     1)
  (view))

(defun view-step (&optional (n 1))
  (run n)
  (view))

実行してみる

(init)
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 1 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step)
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step 45)  ...
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 8 3 0 0 0 
;0 0 5 0 7 0 0 0 
;0 0 4 5 9 0 0 0 
;0 0 0 0 0 0 0 0 

しかし、これだと、おなじ升目から動かない。

→ノイマン型だから

;; moore型に変更
(setq *neighborhood* :moore)
(init) 
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 0 0 0 0 0 
;0 0 0 1 1 0 0 0 
;0 0 1 1 0 0 0 0 
;0 0 0 1 0 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step) 
;
;     DIMENSION 0 (X)  ----->
;
;0 0 0 1 1 0 0 0 
;0 0 1 2 2 0 0 0 
;0 0 2 0 0 0 0 0 
;0 0 1 2 1 0 0 0 
;0 0 0 0 0 0 0 0 

(view-step 50)  
;
;     DIMENSION 0 (X)  ----->
;
;1 2 1 0 5 0 7 0 
;1 1 1 1 7 0 9 1 
;3 1 0 1 1 5 0 0 
;0 0 1 1 1 1 2 4 
;2 0 1 0 1 1 1 0 

ムーア型だと大分ばらける