Frinkは、変数、if/then/else構文、ループ処理、配列、ディクショナリ(連想配列)、集合、関数をサポートしている。関数では、パラメータにデフォルト値を持たせたり、パラメータ値を特定の単位に制限したりできる。
単位の追跡機能にはそれなりの効果があり、変数に適切な単位が与えられていなかったり等式に不備があったりするとそうした点を指摘してくれる。この機能の働きを確認するために、静止していた物体を加速度aで距離sだけ移動させると速度が2*a*sの平方根になることを示す運動方程式を考えてみよう。最初の例を見ると、もともとFrinkで値が定義されている重力(gravity)は正しい値と単位になっているが、移動距離sには単位が与えられていない。そのため、おかしなことに、本来はエネルギーとして表示されるはずの結果が加速度(acceleration)として表示されている。単位が間違っているので、平方根をとっても当然、求めたい速度は得られない。
gravity 196133/20000 (exactly 9.80665) m s^-2 (acceleration) s=300 300 (2*a*s) 5880.0 m s^-2 (acceleration) (2*a*s)^(1/2) 76.68115805072325 m^(1/2) s^-1 (unknown unit type)
移動距離sをきちんとメートル単位(meters)として与えれば(以下を参照)、すべてが期待どおりにうまくいく。別の単位(yard)で移動距離を入力しても、やはり正しく計算が行われることがわかる。
s=300 meters 300 m (length) (2*a*s) 5880.0 m^2 s^-2 (specific_energy) (2*a*s)^(1/2) 76.68115805072325 m s^-1 (velocity) s=5yards 1143/250 (exactly 4.572) m (length) (2*a*s) 89.6112 m^2 s^-2 (specific_energy) (2*a*s)^(1/2) 9.466319242451101 m s^-1 (velocity)
無論、地球の重力はどこでも同じというわけではない。考慮すべき重力の範囲を表すのに区間を使うと計算が難しくなりそうだが、実はそうでもない。次の例の最初の行では、変数gintを重力の区間として宣言しているが、このgintを重力(gravity)の代わりに使う点以外は、先ほどの式とまったく同じで構わないのだ。数値の丸めが必要になった場合は、結果として得られる区間にとり得る値の全範囲が必ず含まれるように、下限については端数の切り捨て、上限については切り上げが行われる。また、区間どうしが重複する場合などは、明示的な区間比較の演算子を使って、あいまい性を解消したほうがよいだろう。
gint = new interval [ 9.797645, 9.80665 ] meters / (second^2) [9.797645, 9.80665] m s^-2 (acceleration) d=500feet 762/5 (exactly 152.4) m (length) (2*gint*s) [89.58966588, 89.6720076] m^2 s^-2 (specific_energy) (2*gint*s)^(1/2) [9.4651817668759, 9.4695304846651] m s^-1 (velocity)
