なんとなく仕様を疑似コードに翻訳しようと思ったけど飽きた
//ROUND()のみ1引数と2引数が存在する。これは1引数のほう
ROUND(o1…`Element[type=INT]`)={
return MAKEINT(round(GETV(o1)))
}
//以下3つ、第2引数が「小数部桁数」ではなく「基準値」であることに注意
ROUND(o1…`Element[type=INT]`,o2…`Element[type=INT]`)={
return MAKEINT(round(GETV(o1)/GETV(o2))*GETV(o2))
}
ROUNDUP(o1…`Element[type=INT]`,o2…`Element[type=INT]`)={
return MAKEINT(ceil(GETV(o1)/GETV(o2))*GETV(o2))
}
ROUNDDOWN(o1…`Element[type=INT]`,o2…`Element[type=INT]`)={
return MAKEINT(floor(GETV(o1)/GETV(o2))*GETV(o2))
}
INT(o1…`Element[type=INT]`)={
return MAKEINT(0 OR TOINT(o1))
}
//ElementをSBネイティブの値に変換する
GETV(o1…`Element`)={
case typeof(o1)
when `Element[type=INT]`:return toNumber(o1)…`Number`
when `Element[type=STR]`:return toString(o1)…`String`
}
//INTを称するが実態はNumberである(慣習的な命名)
//機能的にはGETV()の亜種
TOINT(o1…`Element`)={
case typeof(o1)
when `Element[type=INT]`:return toNumber(o1)…`Number`
otherwise:return 0…`Number`
}
//上に同じく
//命名規則が最悪だが、機能的にはTOINT()の逆
MAKEINT(o1…`Number`)={
return toElement(o1)…`Element[type=INT]`
}
SBはSmileBASICの略
…`ほげほげ` はそのオペランドの型を表す
小文字で書かれているものは、同名のSBの命令・関数と同義
toHoge() はhoge型に変換するという趣旨の仮想の関数
Element型 は計算エンジン内で用いられる仮想の型(SBから見るとtypeの付いたString)