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-06-25

KMRCLを眺める(168) CONCAT-SYMBOL-PKG

| 21:54 | KMRCLを眺める(168) CONCAT-SYMBOL-PKG - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(168) CONCAT-SYMBOL-PKG - わだばLisperになる

今回は、KMRCLのsymbols.lispからCONCAT-SYMBOL-PKGです。

定義は、

(defun concat-symbol-pkg (pkg &rest args)
  (declare (dynamic-extent args))
  (flet ((stringify (arg)
           (etypecase arg
             (string
              (string-upcase arg))
             (symbol
              (symbol-name arg)))))
    (let ((str (apply #'concatenate 'string (mapcar #'stringify args))))
      (nth-value 0 (intern (string-default-case str)
                           (if pkg pkg *package*))))))

となっていて、定義と名前からするに、文字列指示子を受け取って文字列が合成されたシンボルを作成するもののようです。

パッケージを指定する機能もあります。

(KL:CONCAT-SYMBOL-PKG NIL "foo" "bar")
;⇒ FOOBAR

(KL:CONCAT-SYMBOL-PKG :KEYWORD "foo" "bar")
;⇒ :FOOBAR

(KL:CONCAT-SYMBOL-PKG :KL "foo" "bar")
;⇒ KMRCL::FOOBAR

pkgにNILを指定するとカレントパッケージが利用されます。