Macr055で基本演算

拙作のテキストベースマクロプロセッサMacr055( https://github.com/metanest/macr055 )で、和田先生のブログにあるマクロの例題( http://parametron.blogspot.jp/search/label/Christopher StracheyのGPM )をやってみたので、情報共有などのため記録として載せます。

まず http://parametron.blogspot.jp/2015/01/cristopher-stracheygpm.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|+|`{$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|*|`{$1|
  {m55_define|$1|`{+|{*|{1-|$1}|$2}|$2}'}
  {m55_define|0|0}}'}{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}

本家GPM、あるいは和田先生の手元の実装と、m55ではクウォートの掛かりかたが違っていて、m55ではm4と同様に、どれだけ深いクウォートの中であっても変数の $1 などは置換されるため、この程度のマクロの場合は、一部で$$$のように多重エスケープが必要になるものの、全体的には記述が単純になる傾向があるようです(もっと後で出てくる複雑なマクロになると、どちらが有利か、だいぶわからなくなってきます)。