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

Shibuya.lispという名前でCLのユーティリティ集を始めてみました

| 21:10 | Shibuya.lispという名前でCLのユーティリティ集を始めてみました - わだばLisperになる を含むブックマーク はてなブックマーク - Shibuya.lispという名前でCLのユーティリティ集を始めてみました - わだばLisperになる

自分は、ユーティリティ集が大好きなのですが、つねづね自分でも作ってみたいと思っていました。

最近Githubがはやっているので、ここで皆でごちゃごちゃ作ると楽しいのではないかなと思い、Shibuya.lispという人が釣れそうな名前で行くことにしてみました。

勝手に名付けて怒られそうですが、許して下さい。

  • 自分で考えた俺構文や、便利関数も普段から使ってみないと良いアイデアなのか分からないことが多いので、それなりにライブラリに纒めて簡単に使えるようにしておきたい。
  • 自作のユーティリティだとブログ等に書く際に注釈を入れたりしないといけないので、どっかに纒めて誰でも使えるようにして置くと楽そう
  • みんなで作るとカオスになって楽しそう
  • たまたま、githubだと、asdf-installでのインストールが楽だった

という辺りが動機です。

場所は、

です。

パッケージ名は、shibuya.lisp、ニックネームは、slなので、

(sl:listq a b c d)
;⇒ (A B C D)

などと短かく書けて良いかなと思います。

また、自作のユーティリティだとブログ等に書く際に注釈を入れたりしないといけない、というのは、

(require :shibuya.lisp) ; (asdf:oos 'adsf:load-op :shibuya.lisp)
(use-package :shibuya.lisp)

(mapcar (cut * <> 3)
        '(1 2 3 4))
;⇒ (3 6 9 12)

などとインポートする手順だけを書くことによって定義の説明を省けることを期待しています。

インストールは、ASDFを利用している人は、

(asdf-install:install "http://github.com/g000001/shibuya.lisp/tarball/master")

でOKで、常に最新のものがインストールされます。

自分は、gitの使い方が分からないので色々失敗すると多いと思いますが、どんどん取り込む方針ですので、興味があったら是非参加してみて下さい。

リーダーマクロの共有は、完全にカオスになりそうなので別ファイルにしていますが、named-readtables等を使って整理できれば良いかなと考えています。

KMRCLを眺める (55) UPDATE-PLIST

| 00:37 | KMRCLを眺める (55) UPDATE-PLIST - わだばLisperになる を含むブックマーク はてなブックマーク - KMRCLを眺める (55) UPDATE-PLIST - わだばLisperになる

今回は、KMRCLのlists.lisp中からUPDATE-PLISTです。

以前のUPDATE-ALISTと同じくPLISTの内容を変更するユーティリティです。

定義は、

(defmacro update-plist (pkey value plist &key (test '#'eql))
  "Macro to support below (setf get-alist)"
  (let ((pos (gensym)))
    `(let ((,pos (member ,pkey ,plist :test ,test)))
       (if ,pos
           (progn
             (setf (cadr ,pos) ,value)
             ,plist)
         (setf ,plist (append ,plist (list ,pkey ,value)))))))

となっていて、これもUPDATE-ALISTと同じくマクロじゃなくて良い気がしますが、マクロになっています。

更新にはMEMBERで返ってきた値をつかうのですが、これだと、

(DEFPARAMETER *PLIST* (LIST :A 1 :B 2 :C 3 :D 4))

(UPDATE-PLIST 1 :FOO! *PLIST*)

*PLIST*
;⇒ (:A 1 :FOO! 2 :C 3 :D 4)

値の部分もキーとみなされてその次が更新されてしまうことになります…。

ということで良い機会なので自分も試しに作ってみました。

マクロではなくて関数にしています。

(DEFUN MY-UPDATE-PLIST (PKEY VALUE PLIST &KEY (TEST #'EQL))
  (IF (ENDP PLIST)
      (LIST PKEY VALUE)
      (DO ((PL PLIST (CDDR PL))
           (TAIL NIL PL)
           (MODIFYP NIL))
          ((ENDP PL) (PROG1 PLIST
                            (UNLESS MODIFYP 
                              (NCONC TAIL (LIST PKEY VALUE)))))
        (WHEN (FUNCALL TEST PKEY (CAR PL))
          (SETF (CADR PL) VALUE
                MODIFYP 'T)))))

UPDATE-PLISTはドキュメントストリングにも"Macro to support below (setf get-alist)"とタイポがあったり(そして、その(setf get-plistは存在しない…))で、なんとなくなげやりに作られたように思えます('-'*)