OSDN Git Service

【更新内容】
[ring-lang-081/ring.git] / docs / ja-jp / source / functions.txt
1 .. index:: 
2         single: 関数 - 第一形式; はじめに
3
4 ===============
5 関数 - 第一形式
6 ===============
7
8 第一形式による関数の用法を学びます。
9
10 * 関数の定義
11
12 * 関数の呼び出し
13
14 * 仮引数の宣言
15
16 * 仮引数の送信
17
18 * メイン関数
19
20 * 変数のスコープ
21
22 * 返値
23
24 * 再帰処理
25
26 .. index:: 
27         pair: 関数 - 第一形式; 関数の定義
28
29
30 関数の定義
31 ==========
32
33 新しい関数を定義するには
34
35 文法:
36
37 .. code-block:: ring
38
39         func <関数名> [仮引数]
40                 ステートメント・ブロック
41         [end]
42
43 .. note:: 関数の定義において end キーワードはオプション扱いです。
44
45
46 用例:
47
48 .. code-block:: ring
49
50         func hello
51                 see "Hello from function" + nl
52
53
54 .. index:: 
55         pair: 関数 - 第一形式; 関数の呼び出し
56
57 関数の呼び出し
58 ==============
59
60 仮引数を指定せずに関数を呼び出すには、関数名末尾に () を入力します。
61
62 .. tip:: 関数の定義、および関数のコードの記述前に関数を呼び出せます。
63
64 用例:
65
66 .. code-block:: ring
67
68         hello()
69
70         func hello
71                 see "Hello from function" + nl
72
73
74 用例:
75
76 .. code-block:: ring
77
78         first()  second()
79
80         func first   see "message from the first function" + nl
81
82         func second  see "message from the second function" + nl
83
84 .. index:: 
85         pair: 関数 - 第一形式; 仮引数の宣言
86
87 仮引数の宣言
88 ============
89
90 関数へ仮引数を宣言するには、関数名末尾に仮引数リストとしてカンマで区切った
91 識別子のグループを記述します。
92
93 用例:
94
95 .. code-block:: ring
96
97         func sum x,y
98                 see x+y+nl
99
100 .. index:: 
101         pair: 関数 - 第一形式; 仮引数の送信
102
103 仮引数の送信
104 ============
105
106 関数へ仮引数を送信するには、関数名末尾に () の内側で仮引数を入力します。
107
108 文法:
109
110 .. code-block:: ring
111
112         関数名(仮引数)
113
114 用例:
115
116 .. code-block:: ring
117
118         /* 実行結果
119         ** 8
120         ** 3000
121         */
122
123         sum(3,5) sum(1000,2000)
124
125         func sum x,y see x+y+nl
126
127 .. index:: 
128         pair: 関数 - 第一形式; Main 関数
129
130 Main 関数
131 =========
132
133 Ring では、 Main (メイン) 関数はオプション扱いです。 Main 関数が定義された場合は、
134 ほかのステートメント実行後にメイン関数が実行されます。
135
136 ほかのステートメントが存在しない場合に限り、メイン関数は最初の `エントリーポイント <https://ja.wikipedia.org/wiki/エントリーポイント>`_ となります。
137
138 用例:
139
140 .. code-block:: ring
141
142         # このプログラムは、 Hello World メッセージを表示した後にメイン関数を実行します。
143
144         See "Hello World!" + nl
145
146         func main
147                 see "Message from the main function" + nl
148
149 .. index:: 
150         pair: 関数 - 第一形式; 変数のスコープ
151
152 変数のスコープ
153 ==============
154
155 Ring は変数のスコープの決定で `静的スコープ <https://ja.wikipedia.org/wiki/静的スコープ>`_ を使用します。
156  
157 関数の内側で定義される変数は、ローカル変数になります (関数の仮引数も該当します)。
158 関数の外側で定義される変数は、グローバル変数になります (関数の前にあるのは全て該当します)。
159
160 この関数内で定義されたグローバル変数は、別の関数内にある変数としてもアクセスできます。
161
162 用例:
163
164 .. code-block:: ring
165
166         # このプログラムでは 1 ~ 10 までの数値を表示します。
167
168         x = 10                          # x はグローバル変数です。
169
170         func main
171
172                 for t = 1 to 10         # t はローカル変数です。
173                         mycounter()     # 関数の呼び出し
174                 next
175
176         func mycounter
177                 see x + nl              # グローバル変数の値を表示します。
178                 x--                     # 減分します。
179
180
181 .. note:: for ループの変数 t をローカル変数として宣言する前に、 Main 関数を使用してください。
182           つまり、新しい変数のスコープをローカルとして設定するために、命令を直接入力するのではなく、
183           Main 関数では自動的にローカルとして設定することが推奨されます。
184
185 .. index:: 
186         pair: 関数 - 第一形式; 返値
187
188 返値
189 ====
190
191 Return 命令は、関数の値を返します。
192
193 文法:
194
195 .. code-block:: ring
196
197         Return [式]
198
199 .. tip:: Return 命令の後にある式はオプションであり、
200           Return 命令で値を返さずに関数の実行を終了することもできます。
201          
202 .. note:: 関数が明示的な値を返さない場合は、 NULL (空の文字列 = \"\") を返します。
203
204 用例:
205
206 .. code-block:: ring
207
208         if novalue() = NULL     
209                 See "the function doesn't return a value" + nl
210         ok
211
212         func novalue
213
214 .. index:: 
215         pair: 関数 - 第一形式; 再帰処理
216
217 再帰処理
218 =========
219
220 Ring は `再帰 <https://ja.wikipedia.org/wiki/再帰>`_
221 に対応しており、異なる引数を使用して関数が関数自身を再帰的に呼び出せます。
222
223 用例:
224
225 .. code-block:: ring
226
227         see fact(5)     # 実行結果 = 120
228
229         func fact x if x = 0 return 1 else return x * fact(x-1) ok
230