始めてみた & LISP on TeX でナベアツ
主にプログラム,特にTeX関連で書かれるであろう日記を始めてみた.
最初の記事がTeXの濃い話,ナベアツする件について.問題の初出はココ.
これを拙作 LISP on TeX (https://bitbucket.org/hak7a3/lisp-on-tex)でやってみた.
ソースコードはこんな感じ
\documentclass{jarticle} \usepackage{lisp} \begin{document} \font\hoge=cmfi10 \def\NabeAzz#1{\lispinterpl{ (\define \nabe (\lambda \i (\lispif (\= (\- \i :1) :#1) '' (\concat (\internabe \i) ' ' (\nabe (\+ \i :1)))))) (\define \internabe (\lambda \m (\lispif (\= (\* (\/ \m :3) :3) \m) (\group (\concat '\hoge' (\strOfInt \m))) ((\internabei \m) :1)))) (\define \internabei (\lambda \i (\lambda \base (\lispif (\< \i \base) (\strOfInt \i) (\lispif (\= :3 (\/ (\- \i (\*(\/ \i (\* \base :10)) (\* \base :10))) \base)) (\group (\concat '\hoge' (\strOfInt \i))) ((\internabei \i) (\* \base :10))))))) (\print (\nabe :1))}} \tracingmacros=1 \NabeAzz{40} \end{document}
なんかLISPっぽいコードが書けるのが特徴.シンボルはTeXの制御綴り,:num で整数,'string'で文字列(正確にはTeXのトークン列).剰余がないので*1,除算と乗算と減算の組み合わせで実現している.\lispif はif文.\lambdaは一引数関数のみを定義できる.適当にカリー化する必要あり.
出力はこんなのが得られる.
ちなみに,\NabeAzz{1000}とやるとLaTeXが落ちた……
*1:さっさと実装すべき