HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1025
fujihspで契約プログラミング2解決


fuji

リンク

2016/10/25(Tue) 18:00:46|NO.77234

自分もよく知らないですが、DbCというものがあるそうです。
これ使ったら結構コードの質上がるんじゃないかと思って、マクロで作ってみました。
(事前条件と事後条件のみです)
特殊展開マクロに感謝です。

#define global requires(%1) \ if ((%1) == 0) : \ dialog "\"require\" error in line " + __LINE__ : \ end #define global ensures(%1) %tcontract %s1 #define global returns(%1) %tcontract \ ret = %1 :\ if ((%o) == 0) : \ dialog "\"ensures\" error in line " + __LINE__ : end : \ else : return %1 //サンプル #module #defcfunc ascii_code str _char requires strlen(_char) == 1 //事前条件 //ensuresのretは関数の戻り値 ensures (ret >= 'A' && ret <= 'z') || (ret >= 'a' && ret <= 'z') //事後条件 char = _char code = peek(char, 0) //code = 10 //事後条件を満たさないからエラー returns code //ensuresを使う場合はreturnではなくreturns #global mes ascii_code("a") mes ascii_code("A") //mes ascii_code("abc") //事前条件を満たさないからエラー //mes ascii_code("ABC")



この記事に返信する


motchy

リンク

2016/10/25(Tue) 18:36:13|NO.77235

その位なら assert で十分対応できると思うのですが(事後条件の明記が return の直前になるという点を除いて)。
assert に勝る利点は何ですか?



fuji

リンク

2016/10/26(Wed) 06:51:26|NO.77240

こんなのあったんですね
確かにほとんど変わらないかも…
強いて言うならば
・ぱっと見わかりやすい、かっこいい
・わざわざ戻り値を変数に代入しなくてよい
位ですかね
まあ、10行くらいのマクロなので、この程度です。スミマセン



ONION software Copyright 1997-2023(c) All rights reserved.