xyzzy.ansify に取り込まれました。今後はそっちでメンテされるのでこっちは放置になります。
type specifier (型指定子)を便利に。
deftype
で定義した type specifier を使えるように- 未定義の type specifier だったら警告できるように(設定で変更可能)
調べる値の式と type specifier からそれなりに最適化した型チェックをする式を
作る関数を用意しました。主に type specifier を利用するマクロ(もうちょっと
具体的に言うと typecase
)で使うことを考えて作りました。
詳しくは optimize-typep
や optimize-typep-1
のリファレンスを。
(optimize-typep '(typep X 'string))
=> (stringp X)
(optimize-typep '(typep X '(integer 0 100)))
=> (and (integerp X) (<= 0 X 100))
(optimize-typep-1 'X '(or string symbol))
=> (or (stringp X) (symbolp X))
(optimize-typep-1 'X `(or function
(and symbol (satisfies fboundp))))
=> (or (functionp X)
(and (symbolp X) (fboundp X)))
大体2~5倍くらい速くなるようです。(コンパイル後)
引数が指定された型指定子を満たすか判別する関数を返すマクロを用意しました。
(typepred string)
=> #<function: stringp>
(typepred (or string symbol))
;; == (lambda (#1=#:object) (or (stringp #1#) (symbolp #1#)))
=> #<lexical-closure: (anonymous)>
(remove-if-not (typepred (or function
(and symbol (satisfies fboundp))))
(list 'list 'symbol (lambda (x) x) (typepred fixnum)))
=> (list #<lexical-closure: (anonymous)> #<function: *fixnump>)
カフェイン中毒 からどうぞ
typep
への変更は(上書きしているので)読み込んだだけで有効になります。
optimize-typep
は typespec+ パッケージから export
してあるので、必要に応じて
use-package
するかパッケージプレフィックス付きで指定してください。
;; たぶん `optimize-typep` とかを使うマクロを定義するのだろう、ってことで
;; `eval-when` してます。
(eval-when (:load-toplevel :compile-toplevel :execute)
(require "typespec+"))
(use-package :typespec+)
- 関数
typep
を上書きしています
バグ報告、質問、要望などは GitHub Issues か @bowbow99 あたりへ お願いします。