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

shibuya.lisp TT#2 無事開催!

| 21:22 | shibuya.lisp TT#2 無事開催! - わだばLisperになる を含むブックマーク はてなブックマーク - shibuya.lisp TT#2 無事開催! - わだばLisperになる

本日企画されていた、shibuya.lisp TT#2が無事開催され、つつがなく閉幕することができました!

参加して頂いた、発表者のみなさま、観覧者の皆様ありがとうございました。

今回残念ながら黒田さんの「Lisp quote, unquote」はustreamで中継できなかったのですが、スライド写真等は観客の皆様が撮影されていて、また、概要もどなたか纏めて下さると思いますので、そちらを期待しています!

「LISPを使ってCより遅いならLISPを使っている意味がない!」

という檄的な言葉が印象的でした(*'-')

また、和田先生にも講演して頂きましたが、探究される姿勢には敬服の念を抱かざるを得ませんでした。

まだまだ、海のものとも山のものともつかないshibuya.lispというイベントで講演して頂け感謝感激です。

今回は既に次回のTT#3が7/4に企画されています。

これからもshibuya.lispが盛り上がって行ったら良いなと思う一日でした。

#系マクロdo篇

| 03:43 | #系マクロdo篇 - わだばLisperになる を含むブックマーク はてなブックマーク - #系マクロdo篇 - わだばLisperになる

先日defun#というインターンされないシンボルを変数に指定した場合、dynamic-extent宣言するものを作成してみましたが、どうも効果が薄いので繰り返しならどうだということで、do版のdo#を作成してみました。

(import 'metabang.utilities:CAR-SAFE)

(defun reduce-unintern-sym (sym expr wo)
  (subst sym sym
         expr
         :test (lambda (x y)
                 (and (symbolp y)
                      (not (symbol-package y))
                      (not (member y wo))
                      (string= x y)))))

(defmacro do# (varlist test &body body)
  (let ((syms (remove-duplicates
               (remove-if #'symbol-package
                          (mapcar #'car-safe varlist))
               :test #'string=)))
    (reduce (lambda (res x)
              (reduce-unintern-sym x res nil))
            syms
            :initial-value
            `(do ,varlist
                 ,test
               ,@(when syms `((declare (dynamic-extent ,@syms))))
               ,@body))))

テスト用関数

(defun test-dyn ()
  (do# ((#:l (list 1 2 3 4) (cdr #:l)))
       ((endp #:l) 'foo)
    #:l))

;=> 展開
;(DO ((#:L (LIST 1 2 3 4) (CDR #:L)))
;    ((ENDP #:L) 'FOO)
;  (DECLARE (DYNAMIC-EXTENT #:L))
;  #:L)


(defun test-nomal ()
  (do ((l (list 1 2 3 4) (cdr l)))
      ((endp l) 'foo)
   l))

速度比較 (SBCL 1.0.25/64bit Linux)

(loop :repeat 10000000 :do (test-nomal))
;=> NIL
----------
Evaluation took:
  1.084 seconds of real time
  1.110000 seconds of total run time (1.040000 user, 0.070000 system)
  [ Run times consist of 0.400 seconds GC time, and 0.710 seconds non-GC time. ]
  102.40% CPU
  2,596,046,391 processor cycles
  640,211,664 bytes consed
  
(loop :repeat 10000000 :do (test-dyn))
;=> NIL
----------
Evaluation took:
  0.250 seconds of real time
  0.250000 seconds of total run time (0.250000 user, 0.000000 system)
  100.00% CPU
  599,344,623 processor cycles
  255,024 bytes consed

あまり意味のない空ループを猛烈に回したりすると違いはでるようですが、普通に使うところでは殆ど差は出てこないみたいです(笑)

ゲスト



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