コンテンツへスキップ
Varligガイド
Varligホーム

自分で作る関数

同じ式を数値だけ変えて何度も入力しているなら、それを関数にしましょう。式とその入力に一度だけ名前を付けておけば、答えが必要な場所でいつでも呼び出せます。チップの計算、BMIのチェック、貯蓄の見通し、請求書などに使えます。

このページでは、関数の定義と呼び出し、関数がノート内のほかの名前をどう使うか、条件と再帰、そして適用される制限を説明します。sqrtround のようにVarligに最初から用意されている関数については、組み込み関数リファレンスを参照してください。

関数の定義と呼び出し

関数名、かっこで囲んだパラメーター、等号、式の順に書きます。そして、同じ順序で値を渡して呼び出します。

calc
チップ(代金, 割合) = 代金 * 割合
チップ($48, 15%) 答え $7.20
チップ($120, 12.5%) 答え $15.00
チップ($36 + $12, 15%) 答え $7.20

定義の行には答えが表示されません。呼び出すたびに、渡した値が 代金割合 の位置に入り、式が計算されます。上の $36 + $12 のように、引数には計算式全体も使えます。

引数は数値だけでなく完全な値なので、単位や通貨も式の中を通って引き継がれます。

calc
bmi(体重, 身長) = 体重 / 身長^2
bmi(81 kg, 1.8 m) 答え 25 kg/m²

単位は渡したとおりに保持されるので、bmi(81 kg, 180 cm) の答えはkg/cm²になります。何を渡しても同じ単位で答えを得るには、関数の中で変換します。

calc
bmi(体重, 身長) = (体重 / 身長^2) in kg/m^2
bmi(81 kg, 180 cm) 答え 25 kg/m²
bmi(80 kg, 5.9 ft) 答え 24.7375131668 kg/m²

パラメーターのない関数も作れます。定義するときも呼び出すときも、空のかっこを書きます。

calc
標準税率() = 20%
£120 * 標準税率() 答え £24.00

たいていは、標準税率 = 20% のようなふつうの変数を使えば、より少ない入力で同じことができます。

名前とパラメーター

  • 関数名とパラメーター名は1語です。手取り_月額bmi2 のように、文字、数字、アンダースコアを使い、スペースは入れません。円の 面積(r) = pi * r^2 と書くと、代わりに使う名前として 円の_面積 がその行で提案されます。
  • 関数名では大文字と小文字は区別されません。Tip(bill, pct) を定義した後に tip($48, 15%) と呼び出せます。
  • パラメーターにはそれぞれ別の名前が必要です。f(a, a) = a はエラーになります。
  • 1つの関数に使えるパラメーターは最大32個です。
  • 組み込み関数の名前は再利用できません。round(x) = …sqrt(x) = … は組み込み関数を置き換えず、エラーを表示します。ふつうの変数なら、floor = 12 m² のようにそうした名前も使えます。名前を参照してください。
  • 表計算アプリでの綴りである avgtotalstdev は自由に使えます。total(注文) を自分で定義すると、自分で定義したほうが実行されます。
  • 関数と変数は同じ名前を共有できます。単価 は変数を読み、単価(5) は関数を呼び出します。
  • 関数は必ずかっこを付けて呼び出してください。同じ名前の変数がない場合、関数名だけを書くとエラーになります。

引数の中のカンマ

カンマの後ろにスペースがあれば引数の区切り、ちょうど3桁の数字が続けば桁区切りとして読まれるので、金額はふだんどおりに書けます。

calc
チップ(代金, 割合) = 代金 * 割合
チップ($1,200, 15%) 答え $180.00
チップ($1200,15%) 答え $180.00

2つ目の呼び出しのように、スペースで区切られた値の数が関数に必要な数より少ない場合は、すべてのカンマが区切りになります。小数には、チップ($48, 12.5%) のように小数点を使ってください。

ノート内のほかの名前を使う

関数はノートの変数を使えます。呼び出すたびに、その時点での値を読み取ります。

calc
税率 = 20%
税込み(価格) = 価格 * (1 + 税率)
税込み(£50) 答え £60.00
税率 = 5%
税込み(£50) 答え £52.50

変数は関数を定義する時点ですでに存在している必要があるので、税率 = 20%税込み より上に置いてください。まだ存在しない場合、定義の行はエラーを表示します。

パラメーターは関数の中だけで有効です。価格 というパラメーターが、ノートのほかの場所にある 価格 という変数を読んだり変えたりすることはありません。

calc
価格 = £10
二倍(価格) = 価格 * 2
二倍(£3) 答え £6.00
価格 答え £10.00

変数と同じく、ある計算ブロックで定義した関数は、同じノートのそれ以降の計算ブロックでも使えます。Varligはノートを上から下へ順に処理するので、関数はそれを呼び出す最初の行より上で定義してください。定義より上にある呼び出しには答えが表示されません。

ほかの関数を呼び出す関数

小さな関数を組み合わせて使えます。

calc
日額 = £400
報酬(日数) = 日数 * 日額
請求書(日数) = 報酬(日数) * 1.2
請求書(5) 答え £2,400.00

関数は、定義した時点で存在していた補助関数のバージョンを覚えています。同じ補助関数を下のほうで定義し直しても、それより前に定義した関数は古いバージョンを使い続けます。

calc
送料(注文) = £4.95
合計(注文) = 注文 + 送料(注文)
送料(注文) = £2.95
合計(£30) 答え £34.95
送料(£30) 答え £2.95

新しい 送料 を使うには、その下で 合計 を定義し直してください。定義をその場で編集した場合はこうなりません。Varligはノートを最初から計算し直すので、それより下のすべてが編集後のバージョンを使います。

関数は、下のほうで定義する補助関数を呼び出すこともできます。その場合は呼び出した時点での補助関数が使われるので、外側の関数を呼び出すときまでに補助関数が存在している必要があります。

calc
お会計(注文) = 注文 + 配送料(注文)
配送料(注文) = if 注文 >= £40 then £0 else £3.50
お会計(£25) 答え £28.50
お会計(£60) 答え £60.00

条件

結果を選び分けるには if … then … else … を使います。3つ以上の場合分けには、else の後にさらに if をつなげます。

calc
郵便料金(重さ) = if 重さ <= 100 g then £0.85 else if 重さ <= 750 g then £1.55 else £3.20
郵便料金(90 g) 答え £0.85
郵便料金(500 g) 答え £1.55
郵便料金(1.2 kg) 答え £3.20

計算されるのは当てはまる分岐だけです。そのため、ゼロ除算のように、そのままでは失敗する計算を避けるのに使えます。

calc
一人あたり(合計額, 人数) = if 人数 > 0 then 合計額 / 人数 else £0
一人あたり(£90, 3) 答え £30.00
一人あたり(£90, 0) 答え £0.00

再帰

関数は、最終的に条件によって止まるのであれば、自分自身を呼び出せます。次の関数は、グループの全員が互いに1回ずつ握手したときの握手の回数を数えます。

calc
握手(人数) = if 人数 <= 1 then 0 else (人数 - 1) + 握手(人数 - 1)
握手(6) 答え 15
握手(10) 答え 45

呼び出しのたびに入れ子が1段深くなり、入れ子の呼び出しは最大16段までです。握手(16) はまだ動きますが、握手(17)Error: calculation limit を表示します。停止条件に決して到達しない関数も定義することはできますが、呼び出すと同じ制限に達します。2つの関数が互いを呼び出すこともでき、同じ制限が適用されます。

日常的な数え上げには、組み込み関数のほうが速く、このような制限もありません。combination(10, 2) でも 45 が得られ、再帰の典型的な例である階乗は factorial(n) または n! で計算できます。

リスト、行列など

引数にはリスト、行列、複素数を使え、本体ではどの組み込み関数も使えます。

calc
範囲(点数) = max(点数) - min(点数)
範囲([12, 18, 9, 21]) 答え 12

本体には、独自のローカル変数を持つ総和や方程式の解法も含められます。リストと統計総和、方程式の解法、微積分を参照してください。

注意点

  • べき乗は ^ で書きます。 関数の中では は使えません。さらに、短いパラメーター名は単位と一致することがあります。w / h² はパラメーター h ではなく平方時間を意味します。w / h^2 と書いてください。
  • 引数の数を確かめます。 2つの値を受け取る関数を チップ($48) と呼び出すと、エラーを表示します。
  • 1行に1つの式です。 定義は1行に書く1つの式です。複数の手順がある計算では、手順ごとに小さな関数を定義して組み合わせてください。
  • 定義し直しに誤りがあると、古いバージョンが残ります。 チップ の新しい定義に誤りがあると、その行はエラーを表示し、以前の正しく動く チップ がそのまま使えます。
  • ノートが再計算されると答えが変わることがあります。 呼び出しは毎回計算し直されるので、random や今日の日付を使う関数は新しい答えを返すことがあります。
  • エラーはそのまま伝わります。 ゼロ除算のように、引数によって式が失敗すると、呼び出しはそのエラーを表示します。

制限

項目 制限
1つの関数のパラメーター数 32
入れ子の呼び出し(関数が自身またはほかの関数を呼ぶ) 16
最上位の呼び出し1回の計算中に行われる呼び出し 16,384
1つのノートで定義できる関数 1,024

制限に達すると Error: calculation limit が表示されます。ノートのほかの部分は引き続き動作します。すべての制限については、エラー、診断、制限を参照してください。

まとめて使う

フリーランスの請求書です。日額と税率は名前付きの値として一番上に置き、3つの小さな関数で計算します。

calc
# 3月分の請求書
日額 = £450
税率 = 20%
報酬(日数) = 日数 * 日額
税込み(金額) = 金額 * (1 + 税率)
延滞料(金額, 延滞日数) = if 延滞日数 > 30 then 金額 * 2% else £0
デザイン = 報酬(8) 答え £3,600.00
構築 = 報酬(4.5) 答え £2,025.00
小計 = デザイン + 構築 答え £5,625.00
税込み(小計) 答え £6,750.00
延滞料(税込み(小計), 45) 答え £135.00

日額税率 を変えると、その下のすべての行が更新されます。クライアントの支払いが遅れたときは、1回の呼び出しで延滞料を加算できます。