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-12-09

Getting Started in *LISP (14)

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

実に3ヶ月半ぶりなのですが、*Lispのチュートリアルです。

*Lispとは、65536個もCPUがあるConnection Machine用のLISPで、この日記では、それのシミュレータがあるので動かしてみています。\*LISPセクションがありますので興味がある方は是非一緒に遊んでみて下さい(*'-')

この3ヶ月半の間にAllegro CLとCLISP以外ではシミュレータが動かなかったのが型宣言をANSI CLでもコンパイルできるように書き直すことで動くようになりました。

type-system-deftypes.lisp の

(deftype pvar (&optional (element-type '*))
  ;; I have to return a satisfies type with a closure so that typep can work.
  ;; But, returning a closure will blow up both subtypep and the compiler on lucid.
  (let ((closure (*lisp-i::pvar-type-predicate 
                  (cadr (*lisp-i::canonical-pvar-type `(pvar ,element-type))))))
    `(satisfies ,closure)))

が、 satisfies に lambda 式を渡してしまっているのが原因でコンパイルできなかったので

(defvar *pvar-satisfy-tem* '*)

(defun pvar-satisfy-func (&rest args)
  (apply (*lisp-i::pvar-type-predicate 
          (cadr (*lisp-i::canonical-pvar-type `(pvar ,*pvar-satisfy-tem*))))
         args))

(deftype pvar (&optional (element-type '*))
  (let ((*pvar-satisfy-tem* element-type))
    `(satisfies pvar-satisfy-func)))

のように satisfies に渡す関数を大域で定義して大域変数を間に挟んで対処しました。

deftype の中で関数を作成しても良いとは思いますが、SBCLだと関数が複数生成されるようなのでこの方法にしました。この辺ちょっと謎です。

他にもっと良い方法があったら是非教えて下さい!

シミュレータの動作状況ですが、Clozure CLではいまのところ問題ないようですが、SBCLでは、pvarの値を上手くセットできなかったりでいまいちです。自分はSBCLをメインに使ってるのでどうにか対処したいところです。

3.3.5 An Example of Grid Communication

さて、いきなりですが、グリッドタイプのコミュニケーションの説明です。

どうやら前回きりが良くないところで終りにしたみたいで中途半端です。

内容としては、*newsを使ってグリッドの方を動かしてしまおうという内容です。

;; 8x8で初期化
(*cold-boot :initial-dimensions '(8 8))

;; 0で埋める
(*defvar data-pvar 0)

;; 値をセット
(*setf (pref data-pvar (grid 0 2)) 2)
(*setf (pref data-pvar (grid 0 3)) 3)
(*setf (pref data-pvar (grid 0 4)) 4)

;; 確認
(ppp data-pvar :mode :grid :end '(8 8))
;;      DIMENSION 0 (X)  ----->

;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; 2 0 0 0 0 0 0 0 
;; 3 0 0 0 0 0 0 0 
;; 4 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; NIL

ここで前回定義したzig-zag(Getting Started in *LISP (13) - わだばLisperになる - cadr group参照)

で地面をずらしてみます。(zig-zagは、東へ3歩、北へ1歩動かします)

8x8桝で、四方が繋っている(位置の数値が(mod 8)的)ので、こんな感じになります。

(zig-zag data-pvar)

(ppp data-pvar :mode :grid :end '(8 8))
;;      DIMENSION 0 (X)  ----->

;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 2 0 0 
;; 0 0 0 0 0 3 0 0 
;; 0 0 0 0 0 4 0 0 
;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; 0 0 0 0 0 0 0 0 
;; NIL

次回 3.4から再開

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20081209