#:g1

symbol-mungerの紹介

Posted 2014-01-30 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の31日目です。

symbol-mungerとはなにか

 symbol-mungerは、識別子で使われる色々は方式(CamelCase、snake_case、etc)とLispで良く使われるハイフン区切りのシンボル名とを相互に変換するためのライブラリです。

パッケージ情報

パッケージ名symbol-munger
Quicklisp
CLiKihttp://cliki.net/symbol-munger
Quickdocshttp://quickdocs.org/symbol-munger

インストール方法

(ql:quickload :symbol-munger)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 かなり細かくユーティリティが揃っているのですが、動作を見れば何をするものかは分かるかなと思います。

(symbol-munger:english->lisp-symbol "Hello World")
;=>  HELLO-WORLD
;    :INTERNAL

(symbol-munger:english->lisp-symbol "Hello, World!") ;=> |HELLO,-WORLD!| ; :INTERNAL

(symbol-munger:english->lisp-symbol "foo bar baz") ;=> FOO-BAR-BAZ ; :INTERNAL (symbol-munger:underscores->lisp-symbol "foo_bar_baz") ;=> FOO-BAR-BAZ ; :INTERNAL

(symbol-munger:camel-case->lisp-symbol "fooBarBaz") ;=> FOO-BAR-BAZ ; :INTERNAL

(symbol-munger:camel-case->lisp-symbol "FooBarBaz") ;=> FOO-BAR-BAZ ; :INTERNAL

(symbol-munger:lisp->english :foo-bar-baz) ;=> "Foo Bar Baz"

(symbol-munger:lisp->english 'c2mop:compute-applicable-methods-using-classes) ;=> "Compute Applicable Methods Using Classes"

 Lispと他の言語のソースコードとの相互変換等で利用するのに便利そうですね。

まとめ

 今回は、symbol-mungerを紹介してみました。
こういうニッチなライブラリもなかなか良いです。

fare-quasiquoteの紹介

Posted 2014-01-29 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の30日目です。

fare-quasiquoteとはなにか

 fare-quasiquoteは、Scheme方式のQuasiquoteをCommon Lispに導入するものです。

パッケージ情報

パッケージ名fare-quasiquote
Quicklisp
CLiKihttp://cliki.net/fare-quasiquote
Quickdocshttp://quickdocs.org/fare-quasiquote

インストール方法

(ql:quickload :fare-quasiquote)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 SchemeのQuasiquoteをCommon Lispに導入するそもそもの動機は、パターンマッチで`(,x ,y)を使いたかったということのようです。
具体的には、Schemeのmatchでの

(match '(1 2 3)
  (`(,x 5 ,z) (list x y z))
  (`(,x 2 ,z) (list :win x 2 z)))
;=> (:win 1 2 3)

のようなものだと思われます。Common Lispのバッククォートは、リード時に展開されてしまい展開結果も処理系によってまちまちだったりするのですが、展開形が統一されていないとパターンマッチでは色々と不便です。
ということで、fare-quasiquoteには、fare-macherや、optimaと組み合わせて使うユーティリティも付属してきます。
下記の例は、optimaと組み合せて利用する例です。

(ql:quickload :optima)
(ql:quickload :named-readtables)

;; 利用するリードテーブルを変更 (named-readtables:in-readtable :fare-quasiquote)

(optima:match '(1 2 3) ((list x y z) (list x y z))) ;=> (1 2 3)

(optima:match '(1 2 3) (`(,x ,y ,z) (list x y z))) ;=> (1 2 3)

(optima:match '(1 2 3) (`(,x 5 ,z) (list x y z))) ;=> NIL

(optima:match '(1 2 3) (`(,x 5 ,z) (list x y z)) (`(,x 2 ,z) (list :win x 2 z))) ;=> (:WIN 1 2 3)

 また、表示の設定がされていないと、

(let* ((x 1)
       (xx `(,x ,x ,x))
       (qx '`(,x ,x ,x)))
  (list xx qx))
;=>  ((1 1 1) (FARE-QUASIQUOTE::LIST X X X))

のようなことになりますが、(fare-quasiquote:enable-qq-pp)することで

(let* ((x 1)
       (xx `(,x ,x ,x))
       (qx '`(,x ,x ,x)))
  (list xx qx))
;=>  ((1 1 1) `(,X ,X ,X))

と表示されるようになります。
ちなみに、Schemeのようにunquoteを取り出すことはできないようなので、SchemeのQuasiquoteそのままの動作ではないようです。

(list ',x)
;!! unquote outside quasiquote

;;; schemeの場合
(list ',x)
;=>  (,x)

fare-quasiquoteの紹介/関連記事等

まとめ

 今回は、fare-quasiquoteを紹介してみました。
自分もSchemeのmatchをCommon Lispに移植して利用していますが、やはりScheme方式のQuasiquoteを導入して使っています。
リードテーブルを触るのはちょっと…という人も多いかなと思いますが便利な時は便利かなと思います。

synonymsの紹介

Posted 2014-01-28 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の29日目です。

synonymsとはなにか

 synonymsは、Robert Smith氏作の関数言語風の別名を集めたユーティリティです

パッケージ情報

パッケージ名synonyms
Quicklisp
Quickdocshttp://quickdocs.org/synonyms

インストール方法

(ql:quickload :synonyms)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 別名を集めたものとはいえ、今の所は小規模なようです。
Quickdocsの説明だけで十分な気はしますが、代表的なところの例を挙げてみます。

syn:true
;=>  T

syn:false ;=> NIL

(mapcar #'syn:yes '(1 2 3 4 5)) ;=> (T T T T T)

(mapcar #'syn:no '(1 2 3 4 5)) ;=> (NIL NIL NIL NIL NIL)

(syn:strcat "madi-" "katino") ;=> "madi-katino"

(syn:head '(1 2 3 4)) ;=> 1

(syn:tail '(1 2 3 4)) ;=> (2 3 4)

syn:noは使い勝手は良さそうですね。

synonymsの紹介/関連記事等

まとめ

 今回は、synonymsを紹介してみました。
Robert Smith氏のユーティリティを眺めていると一発物が割とあるようですが、気軽にQuicklispに申請というのも悪くはないのかもしれないですね。

hu.dwim.defの紹介

Posted 2014-01-27 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の28日目です。

hu.dwim.defとはなにか

 hu.dwim.defは、関数等の定義フォームのより拡張しやすい形式を提供したユーティリティです。
元祖は、Marco Antoniotti氏作のDEFINER: A COMMON LISP Extensionな気がしますが、dwim.hu版との関係は良く分かりません。

パッケージ情報

パッケージ名hu.dwim.def
Quicklisp
参考サイトCLiki: dwim.hu
Quickdocshttp://quickdocs.org/hu.dwim.def

インストール方法

(ql:quickload :hu.dwim.def)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 hu.dwim.defでは基本的にDylanのようにdefine+何々 という形式で書きますが、defineではなく、短くdefとなっています。

(def function fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

def+functionでdefunになります。defclass、defmacro等々も同じで、さらにユーザーが追加可能です。
標準の状態では、

  • DEFINER
  • INTERFACE
  • FUNCTION
  • METHOD
  • METHODS
  • MACRO
  • COMPILER-MACRO
  • SYMBOL-MACRO
  • GENERIC
  • TYPE
  • MEMBER-TYPE
  • CLASS
  • CONDITION
  • STRUCTURE
  • CONSTANT
  • LOAD-TIME-CONSTANT
  • SPECIAL-VARIABLE
  • CONSTRUCTOR
  • PRINT-OBJECT
  • GLOBAL-VARIABLE
  • WITH-MACRO
  • WITH-MACRO*
  • NAMESPACE
  • PACKAGE
  • ITERATOR

等が用意されている様子。定義のタイプの指定にも拡張機能があり、

(def (function e) fib (n)
  (if (< n 2)
      n
      (+ (fib (1- n))
         (fib (- n 2)))))

と書くと(export 'fib)が追加されます。
この辺りのオプションは、cl-annotに似た感じもあり、defclassのアクセサのexport等の制御オプションも用意されています。

 with-macroというのが面白そうなので試してみましたが、

(def with-macro with-base-8 ()
  (let ((*read-base* 8.)
        (*print-base* 8.))
    (-with-macro/body-)))

のようなものを定義すると、call-with-base-8 とそのラッパーとして、with-base-8が定義されます。

(call-with-base-8 
 (lambda () (print 10.)))
;>>  
;>>  12 
;=>  10

(with-base-8 (print 10.)) ;>> ;>> 12 ;=> 10

しかし、上記のようにパターンにぴったり嵌まれば便利ですが、嵌まらないないと書き方を調べるのがめんどうなので手書きした方が早いとも思えました。
上記の例でも-with-macro/body-が何をするものなのか初見には謎です。

まとめ

 今回は、hu.dwim.defを紹介してみました。
dwim.huの人達は変なことをしていて面白いのでコードを読んでみるのも一興でしょう。

string-caseの紹介

Posted 2014-01-26 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の27日目です。

string-caseとはなにか

 string-caseは、Paul-Virak Khuong氏作の文字列に対するcaseです。

パッケージ情報

パッケージ名string-case
Quicklisp
参考サイトhttp://pvk.ca/string-case.lisp
Quickdocshttp://quickdocs.org/string-case

インストール方法

(ql:quickload :string-case)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 Common Lispでは、caseでの判定はEQLを利用している為、文字列の比較ができないというのはFAQです。
その為、大抵のユーティリティには、今回紹介するstring-caseのようなものが含まれていますが、string-caseは通常のstring=での比較よりも高速な方法を採用しています。
とはいえ、実装が高速なだけで、使い方は普通です。

(let ((x "foo"))
  (string-case:string-case (x)
    ("foo" :win)
    ("fooo" :lose)))
;=>  :WIN

 上記のマクロは、下記のように展開されます

(LET ((#:INPUT3171 "foo"))
  (FLET ((#:ON-ERROR3172 ()
           (ERROR "No match")))
    (LOCALLY
     (DECLARE (TYPE VECTOR #:INPUT3171))
     (CASE (LENGTH #:INPUT3171)
       ((3)
        (LOCALLY
         (DECLARE
          (TYPE (OR (NOT SIMPLE-ARRAY) (SIMPLE-ARRAY * (3))) #:INPUT3171))
         (IF (AND
              (ZEROP
               (LOGIOR (STRING-CASE::NUMERIC-CHAR= #f (AREF #:INPUT3171 0))
                       (STRING-CASE::NUMERIC-CHAR= #o (AREF #:INPUT3171 1))
                       (STRING-CASE::NUMERIC-CHAR= #o (AREF #:INPUT3171 2)))))
             (PROGN :WIN)
             (#:ON-ERROR3172))))
       ((4)
        (LOCALLY
         (DECLARE
          (TYPE (OR (NOT SIMPLE-ARRAY) (SIMPLE-ARRAY * (4))) #:INPUT3171))
         (IF (AND
              (ZEROP
               (LOGIOR (STRING-CASE::NUMERIC-CHAR= #f (AREF #:INPUT3171 0))
                       (STRING-CASE::NUMERIC-CHAR= #o (AREF #:INPUT3171 1))
                       (STRING-CASE::NUMERIC-CHAR= #o (AREF #:INPUT3171 2))
                       (STRING-CASE::NUMERIC-CHAR= #o (AREF #:INPUT3171 3)))))
             (PROGN :WIN)
             (#:ON-ERROR3172))))
       (T (#:ON-ERROR3172))))))

string=の比較ではなく、探索木を作成し、その上で高速なnumeric-char=で比較します。
さらに、SBCLの場合は、numeric-char=がVOPというアセンブリレベルの記述を用いて書かれていて、さらなる高速化が図られています。

string-caseの紹介/関連記事等

まとめ

 今回は、string-caseを紹介してみました。
SBCLでVOPを使って高速化しているコードというのは、あまり多く目にすることはないと思うので参考になるのではないかと思います。

Snow: listの紹介

Posted 2014-01-25 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の26日目です。

Snow: listとはなにか

 Snow: listは、SchemeのパッケージシステムであるSnow(Scheme Now!)の小規模なリストユーティリティです。

パッケージ情報

パッケージ名Snow: list
SnowSnowfort: list

インストール方法

 手元にSnowのシステムがインストールされていなかったので、まずは、そこからと思いましたが、どうも上手く動きません。
どうも6年位放置されているようで、その間に処理系もアップデートしたりして上手く動かない様子。
一応親切なインストールのチュートリアルはあります

折角なので記念にCommon Lispに移植してみました

 オリジナルのソースを眺めるところでは、やはりMarc Feeley氏の好みが反映されているのか、define*であったり、キーワードが:key形式でなく、key:形式だったりします。
定義されているのは、snow-filterと、snow-apply-appendの二つのみ。

雑学

 snow-filterの定義を見て思ったのですが、リストのtailをeq?で比較しています。
filtした結果が同じなら、元のリストを返すというところですが、古のMacLISP時代には、こういう判定はせずに新たにコンスすることが多かったようで、(subst nil nil x)等でリストを再帰的にコピーする等のイディオムがありました。
Common Lispでは、snow-filterのように判定をするので、そういうイディオムは使えません。まあ、copy-treeがあるので必要もないのですが。(ちなみにappend x nilでcopy-listの代り)

(define (snow-filter pred lst)

(define (filt lst) (if (null? lst) lst (let ((head (car lst)) (tail (cdr lst))) (if (pred head) (let ((new-tail (filt tail))) (if (eq? tail new-tail) lst (cons head new-tail))) (filt tail)))))

(filt lst))

(let ((x '(1 2 (3) ((4)) 5))) (eq? (snow-filter identity x) x)) ;=> #t

(define (snow-filter/ pred lst)

(define (filt lst) (if (null? lst) lst (let ((head (car lst)) (tail (cdr lst))) (if (pred head) (cons head (filt tail)) (filt tail)))))

(filt lst))

(let ((x '(1 2 (3) ((4)) 5))) (eq? (snow-filter/ identity x) x)) ;=> #f

まとめ

 今回は、Snow: listを紹介してみました。
Snowの現状はちょっと寂しいことになっているようで残念でしたが、無駄な雑学を発表できて良かったです。

colorizeの紹介

Posted 2014-01-24 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の25日目です。

colorizeとはなにか

 colorizeは、主にLisp系のソースコードをHTMLとして出力するためのライブラリです。

パッケージ情報

パッケージ名colorize
Quicklisp
CLiKihttp://cliki.net/colorize
Quickdocshttp://quickdocs.org/colorize

インストール方法

(ql:quickload :colorize)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 現在colorizeがサポートしている言語は、

  • Lisp汎用
  • Common Lisp
  • Emacs Lisp
  • Scheme
  • Clojure
  • C
  • C++
  • Java
  • Python
  • Erlang
  • Haskell
  • Objective-C
  • Diff
  • Webkit

あたりがあるようですが、当然ながらLisp方言の方に力が入っています。
このブログでも以前から使用していますが、マウスオーバーすると式の深さに応じて式に色が付きます。
その他には、該当するシンボルにはHyperSpecや、R5RSの仕様へのリンクが付けられます。

Common Lispでの設定例

 シンボルにHyperSpec等へのリンクを付加するには、HyperSpec等のシンボル表のファイルと、参照するウェブサイトを設定します。

(setq clhs-lookup::*hyperspec-map-file* "/l/HyperSpec/Data/Map_Sym.txt"
      clhs-lookup::*mop-map-file* "/l/AMOP/Mop_Sym.txt"
      clhs-lookup::*mop-root* "http://www.franz.com/support/documentation/9.0/doc/mop/")

等々

出力例

(colorize:html-colorization :common-lisp
                            "(c2mop:compute-applicable-methods-using-classes #'make-instance (list (find-class t)))")
;=>  "<span class=""><span class="paren1">(<span class=""><a href="http://www.franz.com/support/documentation/9.0/doc/mop/dictionary.html#compute-applicable-methods-using-classes" class="symbol">c2mop:compute-applicable-methods-using-classes</a> #'<a href="http://www.franz.com/support/documentation/9.0/doc/mop/dictionary.html#make-instance" class="symbol">make-instance</a> <span class="paren2">(<span class=""><a href="http://www.lispworks.com/reference/HyperSpec/Body/a_list.htm" class="symbol">list</a> <span class="paren3">(<span class=""><a href="http://www.lispworks.com/reference/HyperSpec/Body/f_find_c.htm" class="symbol">find-class</a> <a href="http://www.lispworks.com/reference/HyperSpec/Body/a_t.htm" class="symbol">t</a></span>)</span></span>)</span></span>)</span></span>"

 実際の表示では、

(c2mop:compute-applicable-methods-using-classes #'make-instance (list (find-class t)))

という風になります。

colorizeの雑多なこと

 利用する場合は、恐らくにそれなりにカスタマイズすることになると思いますが、設定にあたってはまり所をメモしておきます。

再計算防止のフラグがある

clhs-lookup::*populated-p*という再計算防止のフラグがあるので、テーブルを更新しても反映されない場合は、
(let ((clhs-lookup::*populated-p* nil))
  (clhs-lookup:populate-table))

とでもしましょう。

clhs-lookup:spec-lookupのテーブルの引き方が気に食わない

 ざっくり改造してしまっても良いと思いますが、Quicklisp等で自動でインストールすることも考えるとパッチを書いて後からロードするか、ラッパーを書くのが良いかなと思います。

(defun my-spec-lookup (term)
  (clhs-lookup:spec-lookup (string term)))

等々

まとめ

 今回は、colorizeを紹介してみました。
JavaScriptとCSSをカスタマイズできるようなブログシステムを利用の場合、colorizeを利用してみるのもまた一興ではないでしょうか。

sheepleの紹介

Posted 2014-01-22 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の23日目です。

sheepleとはなにか

 sheepleとは、MOPとマルチメソッドを持つCLOS風なプロトタイプベースのオブジェクト指向システムです。

パッケージ情報

パッケージ名sheeple
Quicklisp
参考サイトIntroduction to Sheeple | sykosomatic
CLiKihttp://cliki.net/sheeple
Quickdocshttp://quickdocs.org/sheeple

インストール方法

(ql:quickload :sheeple)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 まず、入門的な記事は、tszさんが既に書かれてますので、そちらを参照すると良いかなと思います。

 オブジェクト指向システムの手軽なサンプルにBankAccountというのがあるらしいのでSheepleで書いてみます。

(defproto =bank-account= ()
  ((dollars 0)))

(defmessage deposit (obj n))

(defreply deposit ((obj =bank-account=) (x =number=)) (incf (dollars obj) x))

(defmessage withdraw (obj n))

(defreply withdraw ((obj =bank-account=) (x =number=)) (setf (dollars obj) (max 0 (- (dollars obj) x))))

(defparameter *my-account* (create =bank-account= 'dollars 200)) ;=> *MY-ACCOUNT*

(dollars *my-account*) ;=> 200

(deposit *my-account* 50) ;=> 250

(withdraw *my-account* 100) ;=> 150

(withdraw *my-account* 200) ;=> 0

(dollars *my-account*) ;=> 0

(defproto =stock-account= (=bank-account=)
  ((num-shares 0)
   (price-per-share 30)))

(defreply (setf dollars) ((x =number=) (obj =stock-account=)) (setf (num-shares obj) (/ x (price-per-share obj))) (dollars obj))

(defreply dollars ((obj =stock-account=)) (* (num-shares obj) (price-per-share obj)))

(defparameter *my-stock* (create =stock-account= 'num-shares 10)) ;=> *MY-STOCK*

(dollars *my-stock*) ;=> 300

(setf (dollars *my-stock*) 600) ;=> 600

(deposit *my-stock* 60) ;=> 660

(num-shares *my-stock*) ;=> 22

(withdraw *my-stock* 120) ;=> 540

(num-shares *my-stock*) ;=> 18

という風に、ほぼそのままCLOSという感じにも書けます。

SheepleのMOP

 SheepleはCLOS風にMOPを装備する方向のようです(といっても開発は停滞しているようですが…)。
APIはそれなりに揃っているので、現状でもCLOS MOPと似たようなことは可能です。定番のオブジェクト生成時にインスタンスを勘定するのは下記のように書けます。

(defproto =counted-sheep= (=standard-metaobject=)
    ((counter 0)))

(defproto =kadorto= (=counted-sheep=))

(defreply smop:allocate-object :after ((obj =kadorto=)) (incf (counter obj)))

(defproto =mahaman= () () :metaobject =kadorto=)

実行してみる
(setf (counter =kadorto=) 0)

(dotimes (i 100) (clone =mahaman=))

(counter =counted-sheep=) ;=> 0 (counter =kadorto=) ;=> 100

CLOS MOP風というかクラス風に=counted-sheep=をそのまま使うと=counted-sheep=の中身が書き変わるのでクローンを作成しています。

sheepleの紹介/関連記事等

まとめ

 今回は、sheepleを紹介してみました。
MOP付きのプロトタイプベースのオブジェクト指向システムというのも珍しいと思います。配布ソースにMOPの例は数点付属しているので興味のある方は遊んでみると良いかなというところです。

hu.dwim.util.temporary-filesの紹介

Posted 2014-01-21 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の22日目です。

hu.dwim.util.temporary-filesとはなにか

 また一時ファイルのユーティリティかい、というところですが、hu.dwim.util.temporary-filesは、dwim.huの人達による一時ファイルの為のユーティリティです。

(ql-dist:system-apropos "tempo")

したら出てきたので、まとめて書いておこうかなと。

パッケージ情報

パッケージ名hu.dwim.util.temporary-files
Quicklisp
CLiKihttp://cliki.net/hu.dwim.util
Quickdocshttp://quickdocs.org/hu.dwim.util/api#system-hu.dwim.util.temporary-files

インストール方法

(ql:quickload :hu.dwim.util.temporary-files)

試してみる

 一つのファイルを開くhu.dwim.util:with-temporary-fileと、複数のファイルを開くhu.dwim.util:with-temporary-filesがあります。
cl-fad:with-open-temporary-fileと同様with-open-fileと同じ作法で使えます。

(hu.dwim.util:with-temporary-file (foo :direction :io)
  (print "hello" foo)
  (print foo)
  (file-position foo 0)
  (read foo))
;>>  
;>>  #<SB-SYS:FD-STREAM for "file /tmp/hu.dwim-4818/4-80890" {1019174BB3}> 
;=>  "hello"

(hu.dwim.util:with-temporary-files ((foo :direction :io) (bar :direction :io)) (print "foo" foo) (print "bar" bar) (file-position foo 0) (file-position bar 0) (list (read foo) (read bar))) ;=> ("foo" "bar")

hu.dwim.util.temporary-filesの紹介/関連記事等

まとめ

 今回は、hu.dwim.util.temporary-filesを紹介してみました。
一時ファイル系のユーティリティは探せばもっとある気もします。

package-renamingの紹介

Posted 2014-01-20 15:00:00 GMT

(LISP Library 365参加エントリ)

 LISP Library 365 の21日目です。

package-renamingとはなにか

 package-renamingはfare氏作の局所的にパッケージをリネームするのに使えるユーティリティです。

パッケージ情報

パッケージ名package-renaming
Quicklisp
CLiKihttp://cliki.net/package-renaming
Quickdocshttp://quickdocs.org/package-renaming

インストール方法

(ql:quickload :package-renaming)

試してみる

 どんな関数があるかは、Quickdocsで確認できます。

 とりあえず、

(defpackage :maporfic
  (:use :cl)
  (:export :foo))

というパッケージがあったとすると、

(package-renaming:call-with-effective-package-renamings
 '((:maporfic :m))
 (lambda () (read-from-string "m:foo")))
;=>  MAPORFIC:FOO
;    5

(find-package :m)
;=>  NIL

(read-from-string "m:foo") ;!! Package M does not exist.

(package-renaming:with-effective-package-renamings ((:maporfic :m)) (read-from-string "m:foo")) ;=> MAPORFIC:FOO ; 5

のような感じで使えます。
ASDFの:around-compileと組み合せて、ファイルのコンパイル時にリネームしたりもできるようです。
ファイルのコンパイルとロードが絡んでくると、色々と注意点や制限はあるようですが、詳しくは、READMEを参照のこと。

まとめ

 今回は、package-renamingを紹介してみました。
局所的にパッケージをリネームしたいこともそんなに無さそうですが、古いライブラリをできるだけ手直ししないで読み込んだりする場合に威力を発揮したりするのかもしれません。

Older entries (1603 remaining)