OSDN Git Service

...。
[ring-lang-081/ring.git] / docs / ja-jp / build / html / _sources / natural.txt
1 .. index:: 
2         single: 自然言語プログラミング; はじめに
3
4 ======================
5 自然言語プログラミング
6 ======================
7
8 プログラミング言語 Ring でクラスとオブジェクトを土台にした自然プログラミング言語を作成できます。
9
10 .. index:: 
11         pair: 自然言語プログラミング; 沿革
12
13 沿革
14 ====
15
16 2010年にプログラミング言語 Supernova の新規開発で Programming Without Coding Technology (PWCT) を使用しました。
17 Supernova は自然言語ステートメントと類似の記法によるコードで GUI アプリケーションを簡単に作成できます。 
18 五年後、いまでは同様の成果を Ring で得ることができます。さらに好みや必要に応じて、
19 どのような問題領域であっても自然言語ステートメントに類似したコードの作成、使用する能力があります。
20
21 Ring は Supernova の精神を受け継いでおり、そのほかにも多種様々な汎用プログラミング言語の精神を受け継いでいます。
22
23 .. index:: 
24         pair: 自然言語プログラミング; 用例
25
26 用例
27 ====
28
29 この用例は、二つの命令を定義するクラスの作成方法です。
30
31 最初の命令は : I want window
32
33 次の命令は : Window title = <式>
34
35 また ‘the’ などのキーワードは無視します。
36
37 .. code-block:: ring
38
39         New App 
40         {
41                 I want window   
42                 The window title = "hello world"
43         }
44
45         Class App
46
47                 # I want window 命令の属性
48                         i want window 
49                         nIwantwindow = 0
50                 # Window title 命令の属性
51                 # ここで window 属性の再定義を行いません。
52                         title 
53                         nWindowTitle = 0
54                 # 値を与えると、キーワードを無視します。
55                         the=0   
56
57                 func geti
58                         if nIwantwindow = 0
59                                 nIwantwindow++
60                         ok
61
62                 func getwant
63                         if nIwantwindow = 1
64                                 nIwantwindow++
65                         ok
66
67                 func getwindow
68                         if nIwantwindow = 2
69                                 nIwantwindow= 0
70                                 see "Instruction : I want window" + nl
71                         ok
72                         if nWindowTitle = 0
73                                 nWindowTitle++
74                         ok
75         
76                 func settitle cValue
77                         if nWindowTitle = 1
78                                 nWindowTitle=0
79                                 see "Instruction : Window Title = " + cValue + nl
80                         ok
81                 
82
83 実行結果:
84
85 .. code-block:: ring
86
87         Instruction : I want window
88         Instruction : Window Title = hello world
89
90
91 .. index:: 
92         pair: 自然言語プログラミング; キーワード‘And’の変更'
93
94 キーワード‘And’の変更
95 =======================
96
97 ‘and’で二つの命令同士をつなげたい場合があります。
98
99 ‘and’ は Ring のキーワードであるため、問題がありますが、
100
101 ChangeRingKeyword 命令により変更できます。
102
103 文法:
104
105 .. code-block:: ring
106         
107         ChangeRingKeyword  <変更元のキーワード>  <変更先のキーワード>
108
109 .. note:: キーワードの復元をお忘れなく。
110
111 .. tip:: ChangeRingKeyword 命令はコンパイラにより、字句解析段階で実行されます (構文解析の前に)。
112         
113 用例:
114
115 .. code-block:: ring
116
117         ChangeRingKeyword       and  _and
118
119         New App
120         {
121                         I want window and the window title = "hello world"
122         }
123
124         Class App
125
126                         # I want window 命令の属性
127                                         i want window
128                                         nIwantwindow = 0
129                         # Window title 命令の属性
130                         # ここで window 属性の再定義を行いません。
131                                         title
132                                         nWindowTitle = 0
133                         # 値を与えると、キーワードは無視されます。
134                                         the=0  and=0
135
136         ChangeRingKeyword       _and  and
137
138                         func geti
139                                 if nIwantwindow = 0
140                                         nIwantwindow++
141                                 ok
142
143                         func getwant
144                                 if nIwantwindow = 1
145                                         nIwantwindow++
146                                 ok
147
148                         func getwindow
149                                 if nIwantwindow = 2
150                                         nIwantwindow= 0
151                                         see "Instruction : I want window" + nl
152                                 ok
153                                 if nWindowTitle = 0
154                                         nWindowTitle++
155                                 ok
156
157                         func settitle cValue
158                                 if nWindowTitle = 1
159                                         nWindowTitle=0
160                                         see "Instruction : Window Title = " + cValue + nl
161                                 ok
162
163                         func getand
164                                 see "Using : and" + nl
165
166
167
168 実行結果:
169
170 .. code-block:: ring
171
172         Instruction : I want window
173         Using : and
174         Instruction : Window Title = hello world
175                         
176
177 .. index:: 
178         pair: 自然言語プログラミング; 演算子 ‘+’ の変更
179
180 演算子 ‘+’ の変更
181 ===================
182
183 “+”演算子などの演算子へ新しい動作を定義したいときがあります。
184
185 この変更は、 ChangeRingOperator 命令を使用することにより、演算子を隠せます (名前自体の変更)。
186
187 そして、演算子を識別子としたものを動作として扱うことができます。
188
189 文法:
190
191 .. code-block:: ring
192         
193         ChangeRingOperator  <変更前の演算子>  <変更後の演算子>
194
195 .. note:: キーワードの復元をお忘れなく。
196
197 .. tip:: ChangeRingOperator 命令はコンパイラにより、字句解析段階で実行されます (構文解析の前に)。
198         
199 用例:
200
201 .. code-block:: ring
202
203         ChangeRingOperator + _+
204
205         New App {
206                 +
207         }
208
209         Class App
210                 + 
211                 func get+
212                         see "Plus operator" 
213
214         ChangeRingOperator _+ +
215
216 実行結果:
217
218 .. code-block:: ring
219
220         Plus operator
221
222 .. index:: 
223         pair: 自然言語プログラミング; ‘=’ 演算子を ‘is’ へ変更するには
224
225 ‘=’ 演算子を ‘is’ へ変更するには
226 ====================================
227         
228 用例:
229
230 .. code-block:: ring
231
232         ChangeRingKeyword       and  _and
233         ChangeRingOperator      =    is
234
235         New App
236         {
237                         I want window and the window title is "hello world"
238         }
239
240         ChangeRingOperator      is    =
241
242         Class App
243
244                         # I want window 命令の属性
245                                         i want window
246                                         nIwantwindow = 0
247                         # Window title 命令の属性
248                         # ここで window 属性の再定義を行いません。
249                                         title
250                                         nWindowTitle = 0
251                         # 値を与えると、キーワードは無視されます。
252                                         the=0  and=0
253
254         ChangeRingKeyword       _and  and
255
256                         func geti
257                                 if nIwantwindow = 0
258                                         nIwantwindow++
259                                 ok
260
261                         func getwant
262                                 if nIwantwindow = 1
263                                         nIwantwindow++
264                                 ok
265
266                         func getwindow
267                                 if nIwantwindow = 2
268                                         nIwantwindow= 0
269                                         see "Instruction : I want window" + nl
270                                 ok
271                                 if nWindowTitle = 0
272                                         nWindowTitle++
273                                 ok
274
275                         func settitle cValue
276                                 if nWindowTitle = 1
277                                         nWindowTitle=0
278                                         see "Instruction : Window Title = " + cValue + nl
279                                 ok
280
281
282 .. index:: 
283         pair: 自然言語プログラミング; Natural コードで Eval() を使うには
284
285 自然言語コードで Eval() を使うには
286 ==================================
287
288 用例:
289
290 .. code-block:: ring
291
292         func Main
293
294           cProgram = ' I want window and the window title is "hello world" '
295
296           MyLanguage(cProgram)
297
298         Func MyLanguage cCode
299
300           # キーワードと演算子を変更する命令をコードへ追加します。
301           # 理由は Eval() はコンパイラの新しいオブジェクトとして使用されるからです (元のキーワードと演算子)。
302           
303           cCode = '
304                 ChangeRingKeyword  and  _and
305                 ChangeRingOperator  =    is
306           ' + cCode
307
308           New App
309           {
310                   eval(cCode)
311           }
312
313
314           Class App
315
316                   # I want window 命令の属性
317                           i want window
318                           nIwantwindow = 0
319                   # Window title 命令の属性
320                   # ここで window 属性の再定義を行いません。
321                           title
322                           nWindowTitle = 0
323                   # 値を与えると、キーワードは無視されます。
324                           the=0  
325
326                   ChangeRingKeyword  and  _and
327                           and=0
328                   ChangeRingKeyword  _and  and
329
330                   func geti
331                         if nIwantwindow = 0
332                           nIwantwindow++
333                         ok
334
335                   func getwant
336                         if nIwantwindow = 1
337                           nIwantwindow++
338                         ok
339
340                   func getwindow
341                         if nIwantwindow = 2
342                           nIwantwindow= 0
343                           see "Instruction : I want window" + nl
344                         ok
345                         if nWindowTitle = 0
346                           nWindowTitle++
347                         ok
348
349                   func settitle cValue
350                         if nWindowTitle = 1
351                           nWindowTitle=0
352                           see "Instruction : Window Title = " + cValue + nl
353                         ok
354
355                 
356 .. index:: 
357         pair: 自然言語プログラミング; BraceStart と BraceEnd メソッド
358
359 BraceStart と BraceEnd メソッド
360 ===============================
361
362 { } の使用前後で実行されるコードを記述できます。
363
364 用例:
365
366 .. code-block:: ring
367
368         o1 = new test {
369                 see "Hello" + nl
370         }
371
372         o1 {}
373
374         class test
375
376                 func bracestart
377                         see "start" + nl
378
379                 func braceend
380                         see "end" + nl
381
382 実行結果:
383
384 .. code-block:: ring
385
386         start
387         Hello
388         end
389         start
390         end
391
392
393 .. index:: 
394         pair: 自然言語プログラミング; BraceExprEval メソッド
395
396 BraceExprEval メソッド
397 ======================
398
399 この用例は、 “BraceExprEval”メソッドで自然言語コードの式を取得するための用法です。
400
401 用例:
402
403 .. code-block:: ring
404
405         new natural {
406                 create 5
407         }
408
409         class natural
410                 create=0
411                 lkeyword = false
412                 func braceexpreval r            
413                         if lkeyword lkeyword=false return ok
414                         see "expr eval" + nl
415                         see "type: " + type(r) see nl
416                         see "value : " see r see nl
417                 func getcreate
418                         lkeyword = true
419                         see "create" + nl
420
421 実行結果:
422
423 .. code-block:: ring
424
425         create
426         expr eval
427         type: NUMBER
428         value : 5
429
430 .. index:: 
431         pair: 自然言語プログラミング; 本物の自然言語コード
432
433 本物の自然言語コード
434 ====================
435
436 この用例は、より高度です。
437
438 .. code-block:: ring
439
440         # 自然言語コード
441         new program {
442                 Accept 2 numbers then print the sum
443         }
444
445         # 自然言語コードの実装
446         class program
447                 # キーワード
448                         Accept=0 numbers=0 then=0 print=0 the=0 sum=0
449
450                 # 実行
451                 func braceexpreval x
452                         value = x
453                 func getnumbers
454                         for x=1 to value
455                                 see "Enter Number ("+x+") :" give nNumber
456                                 aNumbers + nNumber
457                         next
458                 func getsum
459                         nSUm = 0
460                         for x in aNumbers nSum+= x next
461                         see "The Sum : " + nSum
462                 private
463                         value=0 aNumbers=[]
464                 
465 実行結果: 
466
467 .. code-block:: ring
468
469         Enter Number (1) :3
470         Enter Number (2) :4
471         The Sum : 7
472
473 .. index:: 
474         pair: 自然言語プログラミング; BraceError() メソッド
475
476 BraceError() メソッド
477 =====================
478
479 この用例は、 “BraceError” メソッドで括弧 { } を用いてオブジェクトへアクセスした時の
480 エラー処理の用法です。
481
482 用例:
483
484 .. code-block:: ring
485
486         func main
487                 o1 = new point {
488                         x=10 y=20 z=30
489                         TEST
490                         SEE test
491                 }
492
493         class point x y z
494                 func braceerror
495                         see "Handle Error!" + nl
496                         SEE "Message :" + cCatchError + nl
497                         if ( left(cCatchError,11) = "Error (R24)" ) and not isattribute(self,"test")
498                                 see "add attribute" + nl
499                                 addattribute(self,"test")
500                                 test = 10
501                         ok
502                         see "done" + nl
503                         return 
504                         
505 実行結果:
506
507 .. code-block:: ring
508
509         Handle Error!
510         Message :Error (R24) : Using uninitialized variable : test
511         add attribute
512         done
513         10
514         
515 用例:
516
517 .. code-block:: ring
518
519         new point {
520                 x=10 y=20 z=30
521                 test()
522                 see "mmm..." + NL
523         }
524
525         class point x y z
526                 func braceerror
527                         see "Handle Error!" + nl
528                         see "Message :" + cCatchError + nl
529                         see self
530                         see "Done" + NL
531                         
532 実行結果:
533
534 .. code-block:: ring
535
536         Handle Error!
537         Message :Error (R3) : Calling Function without definition !: test
538         x: 10.000000
539         y: 20.000000
540         z: 30.000000
541         Done
542         mmm...
543         
544 .. index:: 
545         pair: 自然言語プログラミング; 美しい自然言語コード
546
547 美しい自然言語コード
548 ====================
549
550 “literal”としてリテラルを入力する代わりに直接単語を受け入れることができます。
551
552 用例:
553
554 この用例では、“hello world”の代わりに hello world を受け入れます。
555
556 この用例では、命令の終了を確認するために braceend() を使用しています。
557
558 このクラスではリテラルで終了する自然言語命令のみ処理します。
559
560 .. code-block:: ring
561
562         ChangeRingKeyword       and  _and
563
564         New App
565         {
566                         I want window and the window title is hello world
567         }
568
569         Class App
570
571                         # I want window 命令の属性
572                                         i want window
573                                         nIwantwindow = 0
574                         # Window title 命令の属性
575                         # ここで window 属性の再定義を行いません。
576                                         title is 
577                                         nWindowTitle = 0
578                         # 値を与えると、キーワードは無視されます。
579                                         the=0  and=0
580                         # データ
581                                         literal = ""
582
583         ChangeRingKeyword       _and  and
584
585                         func geti
586                                 if nIwantwindow = 0
587                                         nIwantwindow++
588                                 ok
589
590                         func getwant
591                                 if nIwantwindow = 1
592                                         nIwantwindow++
593                                 ok
594
595                         func getwindow
596                                 if nIwantwindow = 2
597                                         nIwantwindow= 0
598                                         see "Instruction : I want window" + nl
599                                 ok
600                                 if nWindowTitle = 0
601                                         nWindowTitle++
602                                 ok
603
604                         func gettitle
605                                 if nWindowTitle = 1
606                                         nWindowTitle=2
607                                 ok
608                         
609                         func getis
610                                 if nWindowTitle = 2
611                                         nWindowTitle=3
612                                 ok                      
613
614                         func braceend
615                                 if nWindowTitle = 3
616                                         see "Instruction : Window Title = " + literal + nl
617                                         nWindowTitle = 0
618                                 ok
619
620                         func braceerror
621                                 c= substr(cCatchError,":")
622                                 while c > 0 
623                                         c= substr(cCatchError,":") 
624                                         cCatchError=substr(cCatchError,c+1)  
625                                 end
626                                 literal += substr(cCatchError,1)