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 |

2010-09-17

ディスパッチ・マクロ文字の引数の思いがけない使い方を知りたい

| 23:29 | ディスパッチ・マクロ文字の引数の思いがけない使い方を知りたい - わだばLisperになる を含むブックマーク はてなブックマーク - ディスパッチ・マクロ文字の引数の思いがけない使い方を知りたい - わだばLisperになる

ディスパッチ・マクロ文字は、十進の引数が取れるのですが、無視されることも多いです。

最も有名なディスパッチ・マクロ文字は#'だと思いますが、これも引数を取れます。

(MAPCAR #1234567890'/
        '(1 2 3 4))
;⇒ (1 1/2 1/3 1/4)

これを、なにか画期的なことに使えないでしょうか。

自分がちょっと考えてみたところでは、

  • アメリカなどで使われている数字とアルファベットの対応づけ
;; 34963 => FIXME 
(MAPCAR #34963'(lambda (x) x) '(1 2 3 4))
  • 数字が読みづらいので10進での数値をコメント的に付ける
#10xa
;⇒ 10

#10o12
;⇒ 10

#10922b10101010101010
;⇒ 10922

全然役に立ちそうもないですね。

自分が以前に考えたものでは、Gaucheの#?で引数を使って、デバッグ出力の目印に使ってみる、というのがありました

;; Gaucheの#?=
;; http://cadr.g.hatena.ne.jp/g000001/20070917
(defmacro debug-print (obj &optional name (stream *debug-io*))
  `(let ((hr "** ----------------------------------------")
	 (name (if ,name ,name 0)))
     (format ,stream "~A~%** Debug: #~A | ~A => ~A | ~S~%~0@*~A~%" 
	     hr name ',obj ,obj (type-of ,obj))
     ,obj))

(set-dispatch-macro-character #\# #\?
                              (lambda (stream char arg)
                                (declare (ignore char))
                                (if (char= #\= (peek-char t stream))
                                    (read-char stream))
                                (list 'debug-print (read stream t nil t) arg t)))

;; (DOTIMES (I 3) #77777?=I)
;; ** ----------------------------------------
;; ** Debug: #77777 | I => 0 | BIT
;; ** ----------------------------------------
;; ** ----------------------------------------
;; ** Debug: #77777 | I => 1 | BIT
;; ** ----------------------------------------
;; ** ----------------------------------------
;; ** Debug: #77777 | I => 2 | (INTEGER 0 1152921504606846975)
;; ** ----------------------------------------
;; ⇒ NIL

ちなみに、#10()とするとSBCLやAllegro CLでは、

#10()
;⇒ #(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)

(LENGTH #10() )
;⇒ 10

となるようです。これは処理系の拡張なのでしょうか。