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-04-16

KMRCLを眺める(140) STRING-STRIP-ENDING

| 13:27 | KMRCLを眺める(140) STRING-STRIP-ENDING - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める(140) STRING-STRIP-ENDING - わだばLisperになる

今回はKMRCLのstrings.lispから、STRING-STRIP-ENDINGです。

動作は、与えた文字列の末尾が指定した文字列群のうちのどれかと一致するなら、一致した部分を取り除いて返すというもので

(DEFVAR *FILES* '("FOO.LSP" "BAR.LISP" "BAZ.L"))

(MAPCAR (LAMBDA (X) 
          (KL:STRING-STRIP-ENDING X '(".lsp" ".lisp" ".l")))
        *FILES*)
⇒
("FOO" "BAR" "BAZ")

というところ。

定義は、

(defun string-strip-ending (str endings)
  (if (stringp endings)
      (setq endings (list endings)))
  (let ((len (length str)))
    (dolist (ending endings str)
      (when (and (>= len (length ending))
                 (string-equal ending
                               (subseq str (- len
                                              (length ending)))))
        (return-from string-strip-ending
          (subseq str 0 (- len (length ending))))))))

となっています。

endingsにはリストを与えても良いし、文字列単品でも良いみたいです。個人的な趣味ですがifよりwhenの方が読み易いですね。

ゲスト



トラックバック - http://cadr.g.hatena.ne.jp/g000001/20100416