読者です 読者をやめる 読者になる 読者になる

始めてみた & LISP on TeX でナベアツ

TeX プログラミング

主にプログラム,特にTeX関連で書かれるであろう日記を始めてみた.

最初の記事がTeXの濃い話,ナベアツする件について.問題の初出はココ
これを拙作 LISP on TeXhttps://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:さっさと実装すべき