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 |

2009-01-17

どう書く〜#` リーダーマクロ〜 結果

15:09 | どう書く〜#` リーダーマクロ〜 結果 - わだばLisperになる を含むブックマーク はてなブックマーク - どう書く〜#` リーダーマクロ〜 結果 - わだばLisperになる

気がつけば、「どう書く〜#` リーダーマクロ〜 - わだばLisperになる - cadr group」というお題を出してから10日以上経過してしまいました。

ちょっとマニアック過ぎて誰にも興味を持ってもらえないと思ったのですが、発表からすぐにkozimaさんに解答をブログエントリにして頂けました!

ありがとうございます!

お題を出しておいてなんなんですが、このお題は自分には難しく、ネストした表現は無理で途中で座礁してしまったのですが、晒さない訳にもいかないので恥を晒しておきます(笑)

(defun car-safe (obj)
  (if (consp obj) (car obj) obj))

(let ((*readtable* (copy-readtable nil)))
  (set-macro-character #\, 
    (lambda (str char)
      (declare (ignore char))
      `(comma ,(read str nil nil T))))
  (set-dispatch-macro-character #\# #\`
    (lambda (str char arg)
      (declare (ignore arg char))
      (let ((form (read str nil nil T)))
        (let ((pos (position 'comma form :key #'car-safe)))
          (append  (list 'progn)
                   (mapcar (lambda (x)
                             (append (subseq form 0 pos) x))
                           (apply #'mapcar #'list 
                                  (mapcar #'cadr (subseq form  pos)))))))))
  (map nil #'pprint 
       (list (read-from-string "#`(print ,(1 2 3))")
             (read-from-string "#`(send stream ,(:clear-input :clear-output))")
             (read-from-string "#`(rename-file ,(\"foo\" \"bar\") ,(\"ofoo\" \"obar\"))"))))

;-> (PROGN (PRINT 1) (PRINT 2) (PRINT 3))
;   (PROGN (SEND STREAM :CLEAR-INPUT) (SEND STREAM :CLEAR-OUTPUT))
;   (PROGN (RENAME-FILE "foo" "ofoo") (RENAME-FILE "bar" "obar"))
;=>NIL

Getting Started in *LISP (21)

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

淡々と続けております、*LISP入門。今回は、3.6.2からです。

3.6.2 Where Did the Extra Processors Come From?

Connection Machineでは実プロセッサの数を越えてプロセッサを指定することができるとのことで、この場合は仮想プロセッサが使われるとのこと。

仮想プロセッサはVPと呼ばれます。

実と仮想との違いを意識することはなく透過的に使えるよう自動で設定されるようになっているとのこと。ただし、仮想なので速度は違ってきます。

3.6.3 Defining Custom Configurations - VP Sets

色々なサイズのデータを扱うようになると、pvarのサイズもまたそれに応じて設定する必要がでて来ますが、これまで見たようにpvarのサイズはプロセッサの数と同じなので、これを状況に応じて変えたいということになってきます。

この要求のためには、仮想プロセッサの仕組みを利用して対応させるとのことで、def-vp-set等を利用。

(in-package :*lisp)
(*cold-boot :initial-dimensions '(64 64))

(def-vp-set big-square '(256 256))

と定義した場合、big-squareは、仮想的な256x256の二次元グリッドになります

この作成したVP setsにも値を設定できます。

;; 初期値1で埋めたグリッド
(*defvar big-square-pvar 1 nil big-square)

;; *defvar書式
;; (*defvar variable &optional initial-value documentation (vp-set '*default-vp-set*))
;; 0-19の乱数で埋めたグリッド
(*defvar another-square-pvar (random!! 20) nil big-square)

また、default-vp-setでの宣言時にまとめることも可能です。

(def-vp-set big-square ' (256 256)
  :*defvars '((big-square-pvar 1)
              (another-square-pvar (random!! 20))))

次回、3.6.4から再開