Emacsのregexp-opt.elをxyzzyに移植してみました。
一応Emacs移植キットは使わずに自前で動くようにしてあります。 あまり実用的な出来ではないですが、よかったらどうぞ。
https://github.com/kosh04/xyzzy-lisp/tree -> site-lisp/ -> regexp-opt.lから入手できます。
regexp-opt.elとは?:
GNU Emacs Lispリファレンスマニュアル: 探索と一致-- Function: regexp-opt STRINGS &optional PAREN この関数は、文字列STRINGSのいずれかに一致する効率よい正規表現を返 す。これは、たとえばフォントロック(font-lock)モードなどで、可能 な限り高速な一致や探索を行う必要がある場合に有用である。
使い方:
regexp-opt.lを$XYZZYHOME/site-lisp/ディレクトリ内に置いてバイトコンパイル。 .xyzzyに(require "regexp-opt")と書いてxyzzyを再起動する。
コード例:
(regexp-opt '("aa" "ab" "ba" "bb")) ;;=> "a[ab]\\|b[ab]" (regexp-opt '("defun" "lambda")) ;;=> "defun\\|lambda" (regexp-opt '("defun" "defsubst" "defmacro" "defalias" "defvar" "defconst") t) ;;=> "\\(def\\(?:alias\\|const\\|macro\\|subst\\|un\\|var\\)\\)"バグ・問題点:
- Emacsが返す値と違う(というより冗長な)場合がある
(regexp-opt '("define" "lambda" "fn" "define-macro" "lambda-macro") 'words) ;;=> "\\<\\(define\\(?:-macro\\|\\)\\|fn\\|lambda\\(?:-macro\\)?\\)\\>" [xyzzy] (regexp-opt '("define" "lambda" "fn" "define-macro" "lambda-macro") 'words) ;;=> "\\<\\(define\\(?:-macro\\)?\\|fn\\|lambda\\(?:-macro\\)?\\)\\>" [Emacs]
- 引数の文字列リストが長すぎると、明らかに遅くなる
- マクロのfsetって大丈夫? (si:*fset 'save-match-data #'ed::protect-match-data)
0 件のコメント:
コメントを投稿