LISP on TeX v2.0リリースノート
はじめに
10/25,LISP on TeXのv2.0(CTAN: Package lisp-on-tex)をリリースした.簡単に今回のリリース内容をまとめておく.
READMEの更新
READMEをMarkdown形式に移行した*1.結果,CTANのページ上からREADME.mdが見れるようになっているはずである.
ごみ集め機構(GC)の実装
通常のTeXプログラミングと違い,LISP on TeXでは内部で大量の制御綴りをCONSセルとして使用する.そのため,大量に資源消費するプログラムを作成すると,「! TeX capacity exceeded, sorry」のメッセージとともにTeXの実行そのものが終了してしまう問題があった.その対策として,LISP on TeXにごみ集め機構(GC)を実装した.使用するためには,markGCオプションを使用する.
\usepackage[markGC]{lisp-on-tex}
これでGCが有効になる.これにより,未使用になったCONSセルが再利用されるようになる.
デフォルトでGCはオフになっている.これは,GCを有効にすることによりアロケーション時間が1.5倍かかるようになってしまうのと,実際にGCが必要な場面の方が少ないためである.
なお,GCopt={heapsize=n}というオプションを追加で与えると,ヒープサイズをnにすることができる.指定しない場合は32768が指定されたものとみなす.
エラー出力の強化
以前のリリースでone-shot continuationを実装したことにより,LISP on TeXでは内部的に例外を扱えるようになっていた.そこで,今回のリリースではエラー出力を強化した.例えば.
\lispinterp{(\define 'aaa' :42)}
とすると,
! LISP on TeX ERROR: The 1st argument of \define or \defineM must be a symbol o r valid list..
と出力される.ほかにも引数の個数チェックなどが追加されている.
\defineなどの省略記法
これは,LISP on TeXの初期の課題であった,(\define (\foo \x) ...)の形式を認めるようにする変更である.正直,LISP on TeXにはマクロがあるので,そちらで実装してもいいのだが,速度を考えてTeX側で実装してある.ちなみに,これを実装する最大の動機がこちら.
#LISP on #TeX に欲しい機能.
1. デバッグの機構(macroexpandやGaucheのリーダマクロ #?=).
2. internal define.
3. 文字列処理.
4. 健全なマクロ.
— keno (@keno_ss) 2012, 11月 18
だいぶ時間をあけてしまった.
l3regexのラッパー
文字列,すなわちTeXのトークン列処理の強化として,LISP on TeXに正規表現を導入した.ただし,正規表現エンジンを自前で実装するのはさすがに困難なので,既存のTeX上の正規表現エンジンであるl3regexを使用することにした.
使い方は簡単で,追加のパッケージlisp-mod-l3regexを読み込むだけである.
\usepackage{lisp-mod-l3regex}
これで,いくつかの関数が使用可能になる.例えば
\lispinterp{(\regReplaceAll '(\w+?)to(\w+?)' '$\1\c{to}\2$' 'AtoB BtoC')}
とすると,文字列
'$A\to B$ $B\to C$'
が得られる.正規表現そのものの記法についてはl3regexのドキュメント*2を参考にしてほしい.
また,導入される関数については,LISP on TeXのREADME.mdに記載があるのでそちらを確認してほしい.置換,分割,パターンマッチの関数をそれぞれ用意してある.