PreRebol30ManualGuideWritingCodeCodeDefiningFunctions/ja

From DocBase

Jump to: navigation, search

Contents

REBOL 3 Guide: Code: Defining functions

このセクションの目的は、新しい関数の作り方について簡単に紹介することだ。 より詳しく関数について知りたければ、Functionsを参照のこと。

Contents

  • Defining functions
  • General form
  • Other methods
  • Restricting arguments
  • Embedded comments
  • Function refinements
  • Optional arguments

Defining functions (関数の定義)

様々な種類の関数と、それらの様々な定義の仕方がある。

関数を定義する一番一般的な方法は、funcを用いる方法だ。

次の例を見てみよう:

sum2: func [a b] [a + b]

こう書くことで、新しい関数を次のように呼び出すことが可能になる:

print sum2 10 20
30

General form (一般形)

上に示したように、funcは2つのブロックを引数として取る:

func [specification] [body]

ここで:

specification
specificationは、引数、局所変数、そしてドキュメンテーションといった関数のインターフェースを定義する。
body
bodyにはその関数が呼ばれた際に評価されるコードを書く。

新しい関数が作られた後は、その実体はfuncから返される。 上の例では、sum2変数にその内容がセットされる。

Other methods (他の方法)

上での、funcは、新しい関数を作るために使われる関数である。 これが実行時に行われると、いつでも好きな時に新しい関数を定義することが可能になる。

関数を作る関数は他にもある:

funct
これはデフォルトでは編集が局所的なものであると仮定する。
does
これはspecificationが不要な場合のショートカットだ。
has
局所変数のみが用いられる場合のショートカットだ
make
低レベルの関数コンストラクタ

これらについての詳細は、Functionsを参照のこと。

Restricting arguments (変数の制限)

上でのsum2の例では、引数の型については制限がなかった。 つまり、どのような型の引数であれ与えられるということだ:

print sum2 10:00 2:30
12:30
print sum2 1-Jan-2009 10
11-Jan-2009

だが、引数の型を制限したい場合、specificationブロック内でそれを行うことが可能だ。

次の例では、aとbをともにinteger!に制限している:

sum2: func [a [integer!] b [integer!]] [a + b]

複数の型を認めることも可能だ。次の例では、decimal!を追加している:

sum2: func [
    a [integer! decimal!]
    b [integer! decimal!]
][
    a + b
]

ここで、もしあなたが時刻を引数として与えると、エラーが発生する:

print sum2 10:10 2:30
** Script error: sum2 does not allow time! for its a argument

データ型の名前に加えて、あなたはtypeset!を使うことも可能だ。 これはデータ型のグループだ。 (あらかじめ定義されている型のリストを表示させるには、? typeset!とコンソールから入力すれば良い。)

例えば、number!は、integer!と、decimal!、およびpercent!を含んだ型集合として定義されている。

sum2: func [
    a [number!]
    b [number!]
][
    a + b
]

Embedded comments (埋め込みコメント)

関数の定義の処理の中で、その定義にちょっとしたコメントを追加しておくと便利だ。

例えば:

sum2: func [
    "Adds two numbers and returns the result."
    a [number!] "The first number"
    b [number!] "The second number"
][
    a + b
]

こうしておけば、helpを使って、sum2関数についての問い合わせを行うことが可能となる:

? sum2
USAGE:
    SUM2 a b

DESCRIPTION:
    Adds two numbers and returns the result.
    SUM2 is a function value.

ARGUMENTS:
    a -- The first number (number!)
    b -- The second number (number!)

ちょっとしたドキュメンテーションが覆いに助けになることもある。

Function refinements (関数のリファインメント)

あなたの関数の動作についてオプショナルな変化をつける必要があるかもしれない。 REBOLでは、そのようなオプションのそれぞれに対してrefinement!を追加する。

簡単な例だが、それについて挙げてみよう。 上のコードに加えて、今回は、整数の結果のみが必要なことを示すリファインメントを追加しよう:

sum2: func [
    "Adds two numbers and returns the result."
    a [number!] "The first number"
    b [number!] "The second number"
    /int "Return integer only (truncated)"
][
    either int [to integer! a + b] [a + b]
]

この例では、/intがリファインメントとして追加されており、また、それについてのヘルプの文字列も書かれている。

こう定義することで、このように書くことができる:

sum2 1.2 3.9
5.1
sum2/int 1.2 3.9
5

Optional arguments (オプショナルな引数)

リファインメントはオプショナルな引数を与えるのにも使える。

結果を丸めるためのオプショナルな引数を与えたいとしよう。 そのためには、リファインメントに続いて、それが取るオプショナルな引数を追加する:

sum2: func [
    "Adds two numbers and returns the result."
    a [number!] "The first number"
    b [number!] "The second number"
    /rounded "Return a rounded result"
    precision [decimal!] "The rounding precision"
][
    a: a + b
    if rounded [a: round/to a precision]
    a
]

これを試してみると:

sum2 1.23 3.94
5.17
sum2/rounded 1.23 3.94 .1
5.2

ただし、オプショナルな引数は引数リストの最後に追加することに注意しよう。

Personal tools