53歳限界プログラマの憂鬱

SU/CAR-ST-APplication-cellsから派生したプログラマのブログ

来訪ありがとうございます
シストレツールを自作してました
自分用の記事が多いのであまり役には立たないブログでした

f:id:sucar:20150414193802p:plain

自作システム詳細目次

後から1をORでくっ付け条件を殺す仕組み

自作シストレツールのEsgrsdnlというDSL

条件を書いておいて後からその条件を殺す仕組みを作った

例えば

(
        ?       Dc2>Vpc2
        ?       Dc0>Dc2+Vpcp
_OR
        ?       Dc0<Vpc2
)

というある種のフィルタ

()内の_ORで結合されているどこかが1(TRUE)になれば全体が1(TRUE)になるので条件が殺される

なので

(
        ?       Dc2>Vpc2
        ?       Dc0>Dc2+Vpcp
_OR
        ?       Dc0<Vpc2
_OR
        ?       1
)

と最後に1をORでくっ付ければすべての条件を殺せる

この「1をORでくっ付ける」というのをマクロを使って後からスマートに行える仕組みを作った

 まず

(
        ?       Dc2>Vpc2
        ?       Dc0>Dc2+Vpcp
_OR
        ?       Dc0<Vpc2
        __AfterOR__
)

と書いとく(後からORが来ますの意味:和製英語?)

通常はこの__AfterOR__という字句には意味がないので

  • Compileで無視され
  • Assembleでも無視され

と何の影響も及ぼさない

しかし上の方に

	/#AftOR_1/

と書くと

define(`__AfterOR__',`_OR
	? 1')

というm4マクロが定義され、

()内全体が殺されてしまう という仕組み

# AfterOR
s:/#AftOR_1/\(.*\):define(`__AfterOR_\1_',`_OR\n\t\? 1'):g

というsed script でm4のdifineに置換してる

複数個別に制御したい場合は

__AfterOR_1_
__AfterOR_2_

とでもしといて

/#AftOR_1/1
/#AftOR_1/2

で制御できる

sed は便利だ