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 |

2007-09-14

.1.5

| 13:50 | .1.5 - わだばLisperになる を含むブックマーク はてなブックマーク - .1.5 - わだばLisperになる

前回のmy-setqの定義ですが、Common Lispだと、setを使うとスペシャル変数に代入してしまうことを寝る前に思い出しました。

(defmacro my-setq (&rest symbols-and-values)
  (do ((l symbols-and-values (cddr l))
       (val () (set (car l) `,(cadr l))))      
      ((endp l) val)))

これだとローカル変数には代入せず、スペシャル変数にだけ代入するという謎なものができます。

(let (x y)
  (my-setq x 10 y 30)
  (values x y
  (symbol-value 'x)
  (symbol-value 'y)))
=> nil, nil, 10, 30

結局Common Lispだと、

(defmacro my-setq (&rest symbols-and-values)
  (do ((l symbols-and-values (cddr l))
       (form () (cons `(setq ,(car l) ,(cadr l)) form)))      
      ((endp l) `(progn ,@(nreverse form)))))

のようになるのかもしれません。

CADRのLisp Machine Lispでは、setはsetqのqが取れただけの動きのようなので、以上Common LispとLisp MachineLispの違いというところなのかなーという、全く役に立たない考察でした。