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

添字的symbol-macrolet

| 17:18 | 添字的symbol-macrolet - わだばLisperになる を含むブックマーク はてなブックマーク - 添字的symbol-macrolet - わだばLisperになる

Common Lispの標準では、[]は単なる文字なので、添字のように使ってみようという思い付き。

;; 添字
(let ((foo '(1 2 3 4)))
  (symbol-macrolet ((foo[1] (nth 0 foo))
                    (foo[2] (nth 1 foo))
                    (foo[3] (nth 2 foo))
                    (foo[4] (nth 3 foo))
                    (foo[5] (nth 4 foo))
                    (foo[6] (nth 5 foo))
                    (foo[7] (nth 6 foo)))
    (list foo[2] foo[3] foo[1])))
;=> (2 3 1)

;; ハッシュ
(let ((ht (make-hash-table)))
  (setf (gethash :foo ht) 30)
  (symbol-macrolet ((ht[foo] (gethash :foo ht)))
    (setf ht[foo] 40)
    ht[foo]))
;=> 40 , T