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-01

Getting Started in *LISP (7)

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

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

Chapter 2 The *Lisp Language

この章では、

  1. *Lispの並列型データの基本としてのpvar
  2. データパラレリズム
  3. *Lispでの並列版関数が元のCLのどの関数に相当するか
  4. 並列版関数の定義とコンパイル

についての詳細を解説するとのこと。

2.1 Creating and Using Parallel Variables

*Lispの並列処理で基本となるデータ型は、pvar(Parallel Variable)

このpvarは各々Connection Machineの1プロセッサに対応していて、number、character、array、structure型が扱える。

2.1.1 Creating a Pvar - !!

*Lispで一番単純な並列操作は、!!(バンバンと読むそうな…)で、スカラー値を引数に取り、pvarを返します。

(!! 24)

;=> #<PVAR CONSTANT-24 :GENERAL  *DEFAULT-VP-SET* (8 4)>

これは、24という値を全部のプロセッサに送るもの。

使われるのは一時的な格納場所ということで、!!では、各プロセッサに値を保持することはできない。

2.1.2 Permanent Pvars - *defvar

値を再度設定するまで永続化したい場合は、*defvarを使う。

(*defvar my-pvar 5)

全プロセッサのmy-pvarに5を代入。

*Lispでは、最初から2つの並列版のpvarが設定されていて、並列版t!!と、nil!!がある。CLでは、tとnilに相当。

2.1.3 Local Pvars - *let

*defvarは、大域的で、ローカルにpvarを設定したい場合には、(なんか微妙な表現だな(^^; ) *letが使える

(*let ((two!! 2)
       (three!! 3.0))
  (+!! two!! three!! my-pvar))

これで、全プロセッサで2 + 3.0を計算する。演算子も+!!という並列版を使う必要あり。

2.1.4 Reading, Writing, and Printing Pvar values

プロセッサは沢山あるけれど(Connection Machine(CM-2)の場合65536個)特定のプロセッサの値を見たい場合は、prefが使える。"processor reference"の略でarefの類推から来てるらしい。

(pref my-pvar 12)
;=> 5

これは、12番プロセッサの値を取得する。上で、*defvarで全部5に設定したので、5が返ってくる。

値を代入したい場合は、*setfを使う。

(*setf (pref my-pvar 12) 42)
;=> 42
(pref my-pvar 12)
;=> 42

値をプリティプリントしたい場合は、pppか、pretty-print-pvarを使う。

(ppp my-pvar :end 20)
;>>> 5 5 5 5 5 5 5 5 5 5 5 5 42 5 5 5 5 5 5 5 

12番目が、42になっているのが確認できる。

*setfの他には、set*が使える。これは、setqの並列版なのか、setの並列版なのかどっちなのだろう。

(*set my-pvar 9)

(ppp my-pvar :end 20)
;>>> 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 NIL

(*defvar copy-pvar)
; (ちなみに、初期化しないと#:ILLEGAL-VALUE-21421で埋まっている模様)
(ppp COPY-PVAR :end 1)

(*set copy-pvar my-pvar)
(ppp copy-pvar)
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 NIL

代入できた。

一括で扱うのには、*系、プロセッサで並列に実行させたり、その値は、!!系の名前になっているんだろうか。

GOOでL-99 (P14 各要素を2倍する)

| 15:02 | GOOでL-99 (P14 各要素を2倍する) - わだばLisperになる を含むブックマーク はてなブックマーク - GOOでL-99 (P14 各要素を2倍する) - わだばLisperになる

GOOでもSLIMEが使えるようなので、今回使ってみました。

CVS版SLIMEのcontribの中にある、swank-goo.gooを使うのですが、CL用の設定と競合してしまうようで、slime-setupで読み込むものは、軒並み読み込まないで利用する必要があるようです。

手元で確認できたGOOのバージョンは、155でgooとg2cとありますが、g2cの方を利用。

使い勝手としては、goo-shellだとエラーの度にREPLに移動して、リスタート候補を選択するのが面倒だったのですが、SLIMEだと簡単になった、位でしょうか。飛躍的に便利になる訳ではないようです(^^;

;(dupli '(a b c c d))
;=> (a a b b c c c c d d)

;(dupli #(a b c c d))
;=> #(a a b b c c c c d d)

;(dupli #[a b c c d])
;=> #[a a b b c c c c d d]

;(dupli "abccd")
;=> aabbccccdd

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

(dm dupli (u|<seq> => <seq>)
  (def res (packer-fab <lst>))
  (for ((x u))
    (pack-in res x)
    (pack-in res x))
  (as (class-of u) (packed res)))

オンライン勉強会への道 (1)

| 12:37 | オンライン勉強会への道 (1) - わだばLisperになる を含むブックマーク はてなブックマーク - オンライン勉強会への道 (1) - わだばLisperになる

オフラインで勉強会ができればベストなのですが、物理的に集合しなければならないので、オンラインでの勉強会ができないかと模索しています。

別にCL初心者の私が模索する必要は全くないのですが、どうして勉強会などを呼び掛けてみているのかといえば、勉強会を開くことによってオンラインで入手できる日本語のCLの情報が今よりずっと増えるのではないか?と勝手に考えているからなのです。

私は、

  1. CLer(Lisp面白そう!という人)が増える
  2. CLerが情報発信するようになる
  3. CLの情報が増える
  4. 自分も調べもの等で幸せになれる。

という流れを狙っていて、「自分も調べもので幸せになれる」には、まず自分が調べものをして分かったことを書きまくるのが一番の近道だと思ってこのブログを割と毎日のように更新しています。(単にブログ依存なだけかもしれません(笑) )

ネタ的にも全然CLのことじゃなかったりしますし、CLerの役に立つ内容かと訊かれれば、「いえ、全然(^^;」と答えるしかないですが、とりあえず書いています。

そういうスタンスなのですが、同じように

  1. テーマを絞って情報が薄そうなところを興味のある人が集まって勉強会を行なう
  2. きっと有用な情報が得られて、勉強会のログを参加者が書く
  3. 有用なCLの情報が増える
  4. 自分も調べもの等で幸せになれる

という御利益があるんじゃないかと思うのです。

そういう流れなので、IRCで勉強会を考えてみたりしているのですが、私は、IRCを殆ど使ったことがなく、また、IRCはログ収集を別にしないといけないらしいので、とりあえず、僭越ながらLingrでCLの部屋を作ってみました!

とりあえず、勉強会というよりLISP関係のネタ収集/投稿ができる場という感じを想定しています。

多分、人は全然集まらないので、日によってお題を決めて、ネタを投稿して行くというネタ駆動で回して行くのも良いかなと思っています。

ということで、良かったら是非利用してみて下さい!

初心者質問も大歓迎で、入門的な質問が集まったらFAQにしてどっかに纏めたいと考えています。