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

KMRCLを眺める (88) STRING-APPEND

| 23:29 | KMRCLを眺める (88) STRING-APPEND - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (88) STRING-APPEND - わだばLisperになる

今回からKMRCLのstrings.lispを眺めてゆくことにしました。

KMRCLのなかでも一番大きなファイルで約700行。これだけ半年位続けられそうな気がします。

今回は、STRING-APPENDです。

古くは、LispマシンのLISPであるZetalispなどに同名の関数があるので

(STRING-APPEND "foo" "BAR" "baz")
;⇒ "fooBARbaz"

のような動きを期待してしまいますが、(Zetalispはこの動き)

定義を眺めるに、

(defmacro string-append (outputstr &rest args)
  `(setq ,outputstr (concatenate 'string ,outputstr ,@args)))

となっているので第一引数には変数が来ることになり

(LET ((X "foo"))
  (STRING-APPEND X "BAR" "baz")
  X)
;⇒ "fooBARbaz"

と使うようです。

文字列を連結する関数には、LISP方言によって

Zetalisp => STRING-APPEND

Franz Lisp => concat

Emacs Lisp => concat

TAO => sconc

という風に色々ありますが、Common Lispだと、

(CONCATENATE 'STRING "foo" "BAR" "baz")
;⇒ "fooBARbaz"

や、

(FORMAT NIL "~@{~A~}" "foo" 'BAR '|baz|)
;⇒ "fooBARbaz"

とすることになると思います。

また、近頃だと、処理系に専用の関数が定義されていることもあるようで、Allegro CLなどでは、STRING+というものが定義されているようです。

(UTIL.STRING:STRING+ "foo" 'BAR '|baz|)
;⇒ "fooBARbaz"

専用だけに、FORMATより速いようです。

去年のFranzのLispチュートリアル&セミナーで、黒田さんが、こういう専用関数を作って使うより、FORMATの最適化を頑張るべきだ!と主張していたのをふと思い出しました。

確かに標準の関数で速い方が嬉しいですね('-'*)