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

Getting Started in *LISP (8)

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

*LISPのチュートリアルを細々とさらっております。今回は、2.2章から再開

2.2 Data Parallelism-A Different Value for Each Processor

これまでの内容で、全プロセッサに同じ値を割り付けることは分かった。

しかし、*Lispのデータパラレリズム言語としての肝は、各々のプロセッサが同一のオペレーションをするというところにあり、大抵各プロセッサで違う内容のデータを処理することになるので、それの解説。

各プロセッサに別々の値を割り付けるものには、既出のものでは、random!!がある。

同様のものとしては、self-address!!がある。

プロセッサには一意の番号が定数として割り付けられているので、その番号を取得するもの。

(ppp (self-address!!) :end 20)
;>>> 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

アドレスを指定して値を取得するには、2.1.4で説明されたprefが使える。

2.3 Pvar Data Types

Pvarで利用可能な色々なデータ型を解説。

まず、*Lispへスカラー値が渡った場合は、pvarとみなされるとのこと。

つまり、5と書いても、(!! 5)と見做されるということ。

ブール値

t!!、nil!!等があり、また述語もあり。

(ppp (evenp!! (self-address!!)) :end 10)
;=> T NIL T NIL T NIL T NIL T NIL 
unsigned-byte、 signed-byte
(+!! 3 5)

(ppp (-!! (self-address!!) 800) :end 10)
;>>> -800 -799 -798 -797 -796 -795 -794 -793 -792 -791 
defined-float
(float!! 34)

(ppp (/!! (self-address!!) 4) :end 10)
;>>> 0.0 0.25 0.5 0.75 1.0 1.25 1.5 1.75 2.0 2.25 
complex
(complex!! 3 1)

(ppp (complex!! (self-address!!) 1) :end 5)
;>>> #C(0 1) #C(1 1) #C(2 1) #C(3 1) #C(4 1) 
character
(!! #\C)
(int-char!! 23)

(ppp (!! #\C) :end 10)
;>>> #\C #\C #\C #\C #\C #\C #\C #\C #\C #\C 

;; int-char!!がエミュレータにはない。
;; code-char!!になっている様子。

(ppp (code-char!! 23) :end 10)
;>>> #\^w #\^w #\^w #\^w #\^w #\^w #\^w #\^w #\^w #\^w 
array
(ppp (make-array!! '(2 8) :element-type 'single-float :initial-element pi) :end 1)
;>>> #2A((3.141592653589793d0 3.141592653589793d0 3.141592653589793d0
;         3.141592653589793d0 3.141592653589793d0 3.141592653589793d0
;         3.141592653589793d0 3.141592653589793d0)
;        (3.141592653589793d0 3.141592653589793d0 3.141592653589793d0
;         3.141592653589793d0 3.141592653589793d0 3.141592653589793d0
;         3.141592653589793d0 3.141592653589793d0)) 
structure
(*defstruct particle
  (x-pos 0 :type (unsigned-byte 32))
  (y-pos 0 :type (unsigned-byte 32)))

(*let ((sts (make-particle!! :x-pos 20 :y-pos 61)))
  (ppp (particle-x-pos!! sts) :end 10))
;>>> 20 20 20 20 20 20 20 20 20 20 
2.3.1 Other Pvar Types

その他に扱えるものとして、front-endがあり、参照を格納できるらしい。

(ppp (front-end!! 3) :end 10)

(ppp (front-end!! '(foo bar baz)) :end 5)
;>>> (FOO BAR BAZ) (FOO BAR BAZ) (FOO BAR BAZ) (FOO BAR BAZ) (FOO BAR BAZ) 
(ppp (!! '(foo bar baz)) :end 10)
;!!! Cannot put values of type CONS into a pvar
;となり、pvarにはコンスは格納できない。

上記のように、コンス(リスト)はPVARに格納できないので、扱うとすれば、ポインタ参照経由でということになるのだろうか。

まだ、それぞれのプロセッサごとに異なる参照を格納する解説はなし。

ということで、色々な型のデータをpvarとして格納できることが分かった。

また、PVAR変数の作成は、

(*defvar my-pvar 5)

のようにするが、型を指定したpvarの作り方については、5章で解説するとのこと。