Macr055でアッカーマン関数他

次の http://parametron.blogspot.jp/2015/02/christopher-stracheygpm_22.html の記事に移って、アッカーマン関数他。

アッカーマン関数

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|a|`{$1|
  {m55_define|$1|`{$2|
    {m55_define|$2|`{a|{1-|$1}|{a|$1|{1-|$2}}}'}
    {m55_define|0|`{a|{1-|$1}|1}'}}'}
  {m55_define|0|`{1+|$2}'}}'}{m55_dnl}
{a|0|0}, {a|0|1}, {a|0|2}, {a|0|3}, {a|0|4}, {a|0|5}, {a|0|6}, {a|0|7}, {a|0|8}
{a|1|0}, {a|1|1}, {a|1|2}, {a|1|3}, {a|1|4}, {a|1|5}, {a|1|6}, {a|1|7}
{a|2|0}, {a|2|1}, {a|2|2}, {a|2|3}
{a|3|0}

カタラン三角形

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|+|`{$1|
  {m55_define|$1|`{1+|{+|{1-|$1}|$2}}'}
  {m55_define|0|$2}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|{m55_define|p|`{lt|{1-|$1}|$2}'}}'}
  {m55_define|-1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|or|`{$1|
  {m55_define|$1|t}
  {m55_define|f|$2}}'}{m55_dnl}
{m55_define|c|`{$1$2|
  {m55_define|$1$2|`{{or|{lt|$1|0}|{lt|$2|$1}}|
    {m55_define|t|0}
    {m55_define|f|`{+|{c|$1|{1-|$2}}|{c|{1-|$1}|$2}}'}}'}
  {m55_define|00|1}}'}{m55_dnl}
{c|0|0}
{c|0|1}, {c|1|1}
{c|0|2}, {c|1|2}, {c|2|2}
{c|0|3}, {c|1|3}, {c|2|3}, {c|3|3}
{c|0|4}, {c|1|4}, {c|2|4}
{c|0|5}, {c|1|5}
{c|0|6}, {c|1|6}
{c|0|7}, {c|1|7}
{c|0|8}, {c|1|8}
{c|0|9}, {c|1|9}

論理演算

縦棒をマクロの記法で使っている都合で、記号ではなく名前で定義。XORについては先生のブログにある定義と違っていて、直截な定義にしてある。

{m55_define|and|`{$1|
  {m55_define|$1|f}
  {m55_define|t|$2}}'}{m55_dnl}
{m55_define|or|`{$1|
  {m55_define|$1|t}
  {m55_define|f|$2}}'}{m55_dnl}
{m55_define|not|`{$1|
  {m55_define|t|f}
  {m55_define|f|t}}'}{m55_dnl}
{m55_define|xor|`{$1|
  {m55_define|$1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|maj|`{or|{or|{and|$1|$2}|{and|$2|$3}}|{and|$3|$1}}'}{m55_dnl}
{maj|f|f|f}, {maj|f|f|t}, {maj|f|t|f}, {maj|f|t|t}
{maj|t|f|f}, {maj|t|f|t}, {maj|t|t|f}, {maj|t|t|t}

ヒルベルト曲線

SVGのpath要素のd属性を生成する。SVGのhコマンドとvコマンドを使って表現を圧縮している。SVGは左上原点だがそれの調整をしてないので、先生のPostScriptによる生成結果とは上下逆になる。

{m55_define|1+|`{1|2|3|4|5|6|7|8|9|10|
  {m55_define|1|$$$1}}'}{m55_dnl}
{m55_define|1-|`{-1|0|1|2|3|4|5|6|7|8|
  {m55_define|-1|$$$1}}'}{m55_dnl}
{m55_define|+|`{$1|
  {m55_define|$1|`{1+|{+|{1-|$1}|$2}}'}
  {m55_define|0|$2}}'}{m55_dnl}
{m55_define|-|`{$2|
  {m55_define|$2|`{-|{1-|$1}|{1-|$2}}'}
  {m55_define|0|$1}}'}{m55_dnl}
{m55_define|lt|`{$1|
  {m55_define|$1|`{p|$1|$2|
    {m55_define|p|`{lt|{1-|$1}|$2}'}}'}
  {m55_define|-1|t}
  {m55_define|$2|f}}'}{m55_dnl}
{m55_define|r|`{{lt|$1|$2}|
  {m55_define|t|$1}
  {m55_define|f|`{r|{-|$1|$2}|$2}'}}'}{m55_dnl}
{m55_define|^|`{r|{1+|$1}|4}'}{m55_dnl}
{m55_define|_|`{r|{1-|{+|4|$1}}|4}'}{m55_dnl}
{m55_define|f|`{$1|
  {m55_define|0|h20}
  {m55_define|1|v20}
  {m55_define|2|h-20}
  {m55_define|3|v-20}}{$2|
  {m55_define|$2|
}
  {m55_define|1}}'}{m55_dnl}
{m55_define|p|`{$1|
  {m55_define|$1|`{q|{1-|$1}|{^|$2}}{f|{^|$2}|$1}{p|{1-|$1}|$2}{f|$2|$1}{p|{1-|$1}|$2}{f|{_|$2}|$1}{q|{1-|$1}|{_|$2}}'}
  {m55_define|0}}'}{m55_dnl}
{m55_define|q|`{$1|
  {m55_define|$1|`{p|{1-|$1}|{_|$2}}{f|{_|$2}|$1}{q|{1-|$1}|$2}{f|$2|$1}{q|{1-|$1}|$2}{f|{^|$2}|$1}{p|{1-|$1}|{^|$2}}'}
  {m55_define|0}}'}{m55_dnl}
<svg xmlns="http://www.w3.org/2000/svg" width="240" height="240">
  <g fill="none">
    <g stroke="#000">
      <path d="m50 50
{p|3|0}{m55_dnl}
"/>
    </g>
  </g>
</svg>