コンテンツにスキップ
Wikipedia

「利用者:Monadaisuki/sandbox」の版間の差分

削除された内容 追加された内容
1行目: 1行目:
{{User sandbox}}
{{User sandbox}}
<!-- この行より下を編集してください -->
<!-- この行より下を編集してください -->
= RPL言語 =
{{Infobox プログラミング言語
| 名前 = RPL (Reverse Polish Language)
| パラダイム = スタック指向、[[手続き型]]、[[構造化プログラミング]]、[[オブジェクト指向]]
| 登場時期 = [[1984年(1986年)]]
| 設計者 = [[ヒューレット・パッカード]]
| 型付け = なし
| 処理系 = UserRPL、SystemRPL
| 影響を受けた言語 = [[Forth]],[[Lisp]]
| 影響を与えた言語 = なし
}}ここで説明することは、コモドール社のPET/CBMコンピューター用の Reverse Polish Languageではない。コンパイル型データベースプログラミング言語である Real-time Programming Language でもない。

RPL言語(初期開発者によるとReverse Polish Lispに由来する。[2][3][4][5][6][7] 一方、HP社のマーケティングは1987年の短い期間の間、RPLから逆に ROM-based Procedural Language という意味をこじつけで作り出そうとした。[1][7][8])は、ハンドヘルド電卓のOSであり、アプリケーションプログラミング言語である。ヒューレット・パッカード社の科学技術計算グラフRPN(逆ポーランド記法)電卓のHP 28 シリーズ、HP 48 シリーズ、HP 49/50 シリーズで使われた。しかし、HP 38G、HP 39/40 シリーズのような非RPN電卓でも使用可能である。

RPL言語はRPNに基づいた構造化プログラミング言語であるが、RPNだけでなく代数式と方程式も扱える。RPL言語はスレッド化されたインタープリターとして実装されている。[9] RPL言語はForth言語と多くの類似点がある。両言語はスタック指向であり、Lispのようなリスト指向だけではない。以前のHP社のRPN電卓(4レベル固定スタック)に反して、RPL言語が使えるスタックは利用可能な電卓のRAMさえあれば、スタックのレベル数を増やせる。

RPL言語は1984年にオレゴン州コーヴァリス市の開発拠点で誕生した。アセンブリ言語でOSを実装する以前の技術を置き換えるために開発された。[10] RPL言語に対応した最後の電卓はHP 50gであり、2015年に製造終了となった。[11][12][13]

== RPL言語の種類 ==
RPL言語の中でもシステムの低レベルから中レベルまでを扱うSystem RPL(もしくはSysRPL)言語は、OSを実装する言語の一部として前述の機種だけでなくいくつかの初期のHP社電卓で使われた。 HP 48 シリーズの場合、外部ツールを使わないとSystem RPLを電卓使用者は使用できない。しかし、HP 49/50 シリーズの場合、SysRPLを使うための内蔵コンパイラを搭載している。SysRPLでコーディングを行うと深刻なクラッシュを引き起こす可能性があるので、取扱は慎重にするべきである。

RPL言語の一種である高レベル言語のUser RPL(もしくは UserRPL)は、グラフィックスアプリケーションプログラムだけでなくテキスト型のプログラムを開発するために前述の電卓で利用できる。 全てのUserRPLプログラムは内部的にはSysRPLとして記述されている。しかし、利用可能なSysRPLコマンドの中の安全なサブセットだけを使う。 UserRPLのコマンドはエラーチェックを行うので安全ではあるが、そのエラーチェックによって UserRPL プログラムは SysRPL プログラムよりも非常に動作が遅くなっている。 UserRPLコマンドのSYSEVALはUserRPLプログラムの指定された部分をSysRPLコードとして処理することを電卓に伝える。

== 制御構造 ==
RPL言語は厳密な後置記法ではない。いくつかの重要な例外は存在するものの、制御構造は標準的な中置記法の言語のように見える。これらの制御構造を実装することによって、必要な時にプログラムの内部でプログラムの一部を飛ばすことができる。

=== スタック ===
RPL言語のスタックはインタプリタ上に実装されたソフトウェア的なものであり、CPUのスタックではない。 スタックの底辺がスタックレベル1であり、電卓上では"1:"と表示される。スタックレベル番号が大きいほどスタックの上になる。 スタックの出し入れ(POP/PUSH)は基本的にスタックの底辺から行われる。

RPL言語は文中でオブジェクト(数値、数式、文字列、条件式、プログラムブロックなど)に遭遇すると何も考えずにスタックにオブジェクトを入れることが動作の基本である。コマンドに遭遇したときはコマンドを実行する。 条件式、数式、プログラムブロックのような実行できるオブジェクトは条件文などのコマンドが実行する場合と、EVALコマンドで意識的に実行することがある。

=== 条件文 ===

==== IF/THEN/ELSE/END ====
RPL言語はIF/THEN/ELSE/END構造を使って基本的な条件分岐をサポートする。この制御構造の基本的な文法は以下のようになる。 IF condition THEN if-true [ELSE if-false] END

以下の例はスタックの底辺(スタックレベル1)の値が"1"であるかどうかをテストし、そうであれば、"1"を"Equal to one"の置き換える。<syntaxhighlight>
« IF 1 == THEN "Equal to one" END »
</syntaxhighlight>IF文はcondition(条件)を評価するとその結果(0:偽あるいは1:真)をスタックの底辺に残す。そして、その条件の結果を得るためにスタックの底辺を検証する。 この動作を利用すると、RPLはForth形式のIF文をオプションでサポートすることができる。つまりIF文の前に評価される条件を書くことができる。 IF文の条件を空にすることによって、IF文は条件実行の間にスタックの変更を行わない。そして、検証のためにスタックの底辺にある既存の結果(IF文の前に書いた条件の結果のこと。0:偽あるいは1:真)を使う。<syntaxhighlight>
« 1 == IF THEN "Equal to one" END »
</syntaxhighlight>

==== IFT/IFTE ====
IFT ("if-then")文 と IFTE ("if-then-else")文を使うことによって後置条件式を実現できる。 IFTとIFTEはそれぞれ2つまたは3つのオブジェクトをスタックから取り出す。 取り出した2つまたは3つのオブジェクトの最上位のオブジェクトは真偽値として評価される。もしも真ならば、上から2番目のオブジェクト("then"に相当)はスタックに戻される。 IFTEは上から3番目の"else"に相当するオブジェクトを必要とする。偽の場合、そのオブジェクトがスタックに戻される。 以下の例は、IFT文の例である。スタックの底辺から1つのオブジェクトを取り出し、それが1ならば、1を"One"に置き換える。

(説明)'1 =='と"One"が2つのオブジェクトである。これらは順番にスタックに入れられる。RPL言語は文中にオブジェクトが登場すると何も考えずにスタックにオブジェクトを押し込むことが動作の基本である。コマンドがあるときだけコマンドを実行する。IFT文はこの2つのオブジェクトをスタックから取り出す。そして、'1 =='の右辺はスタックの底辺を暗黙で意味するので、何も書かれていない。つまり、IFT文が取り出す2つのオブジェクトの上に'1 =='の右辺に相当するオブジェクトも必要である。そのオブジェクトはプログラム実行前にユーザーが自分でスタックに入れる必要がある。<syntaxhighlight>
« 1 == "One" IFT »
</syntaxhighlight>以下の例はIFTE文の例である。スタックの底辺からオブジェクトを取り出し、それが1と等しいならば、1を"One"に置き換える。それが1でない場合は、それを"Not one"に置き換える。

« 1 == "One" "Not one" IFTE »<syntaxhighlight>
« 1 == "One" "Not one" IFTE »
</syntaxhighlight>IFTとIFTEは引数として与えられたプログラムブロック(最初の行と最後の行以外の« »で囲まれたところ)を評価する。

(説明)RPL言語はオブジェクトと見なしたものはそれがプログラムブロックでも実行しないでスタックに入れる。そのため、評価(evaluate)されるまで実行されない。

その動作を利用することによって、IF/THEN/ELSE/END構造よりもさらにコンパクトな条件文を作ることができる。

以下の例はスタックの底辺からオブジェクトを取り出して、それが1と等しいのか、1より小さいのか、1より大きいのかを判断してからそれを"One"、"Less"、"More"のどれかに置き換える。<syntaxhighlight>
«
DUP 1 ==
« DROP "One" »
« 1 < "Less" "More" IFTE »
IFTE
»
</syntaxhighlight>

==== CASE/THEN/END ====
より複雑な条件論理式をサポートするためにRPL言語は複数の条件から排他的に1つの条件を選ぶテストを実行するCASE/THEN/END構造を提供する。 CASE文の中の1つだけの選択肢が実行される。この構造の基本文法は以下のようになる。
CASE
condition_1 THEN if-condition_1 END
...
condition_n THEN if-condition_n END
if-none
END
以下のコードは CASE/THEN/END 構造の使用方法を説明している。 スタックの底辺にある1文字を取得して、それに対応する文字列をそれと置き換える。対応する文字がない場合は"Unknown letter"で置き換える。
«
CASE
DUP "A" == THEN "Alpha" END
DUP "B" == THEN "Beta" END
DUP "G" == THEN "Gamma" END
"Unknown letter"
END
SWAP DROP @ Get rid of the original letter
»
上のコードは以下のIF/THEN/ELSE/END構造を入れ子にしたものと等価である。
«
IF DUP "A" ==
THEN
"Alpha"
ELSE
IF DUP "B" == THEN
"Beta"
ELSE
IF DUP "G" == THEN
"Gamma"
ELSE
"Unknown letter"
END
END
END
SWAP DROP @ Get rid of the original letter
»

=== ループ文 ===

==== FOR/NEXT ====
RPL言語はあるインデックス値から他のインデックス値までループするためのFOR/NEXT文を提供する。 ループ用のインデックス値はループ内でプログラムからアクセス可能な一時的ローカル変数(インデックス変数)に格納される。 FOR/NEXTブロックの文法は以下のようになる。

index_from index_to FOR variable_name loop_statement NEXT

以下の例は1から10までの数値を合計するためにFORループを使っている。 FORループのインデックス変数は"I"である。
«
0 @ Start with zero on the stack
1 10 @ Loop from 1 to 10
FOR I @ "I" is the local variable
I + @ Add "I" to the running total
NEXT @ Repeat...
»
(説明)FORループの中で'I +'という記述がある。最初の"I"はインデックス変数であり、1から10の値をとる。"I"はオブジェクトでもあるので、無条件にスタックに入れられる。次の+はコマンドである(多くの言語では+を演算子とするが、RPL言語ではコマンド扱い)。+コマンドはスタックから2つのオブジェクトを取り出して加算して、その結果をスタックに入れる。I=1のとき、スタックの底辺に0が入っているので、0 + 1 = 1 となり、結果の1をスタックに入れる。I=2のとき、スタックの底辺に1が入っているので、1 + 2 = 3 となり、結果の3をスタックに入れる。この繰り返しで1から10までの数値を合計する。

==== START/NEXT ====
START/NEXTブロックは開始インデックスから終了インデックスまでを実行する単純な構造のために使われる。 FOR/NEXTループと違って、インデックス変数(ループ変数)はプログラムから利用できない。しかし、インデックス変数は内部的に存在する。 NEXTコマンドはインデックス変数を+1するだけである。 START/NEXTブロックの文法は以下のようになる。<syntaxhighlight>
index_from index_to START loop_statement NEXT
</syntaxhighlight>

==== FOR/STEP and START/STEP ====
FOR/NEXTとSTART/NEXTは1回のループでインデックス変数を+1することしかできない。 しかし、NEXTを増分値とSTEPで置き換えると、インデックス変数は+1以外の値で増やしたり減らしたりできる。 例えば、以下のループはインデックス変数を1回のループ毎に-2減算することによって、10から2へ逆行するようにループする。<syntaxhighlight>
« 10 2 START -2 STEP »
</syntaxhighlight>

==== WHILE/REPEAT/END ====
RPL言語のWHILE/REPEAT/ENDブロックはループの開始地点で条件テストをする回数未定のループをサポートする。 WHILE/REPEAT/ENDブロックの文法は以下のようになる。<syntaxhighlight>
WHILE condition REPEAT loop_statement END
</syntaxhighlight>

==== DO/UNTIL/END ====
RPL言語のDO/UNTIL/ENDブロックはループの最後で条件テストをする回数未定のループをサポートする。 DO/UNTIL/ENDブロックの文法は以下のようになる。<syntaxhighlight>
DO loop_statement UNTIL condition END
</syntaxhighlight>

== 出典 ==
{{Reflist|refs=<ref name="HPJ38">{{cite journal | title=Computation for Handheld Calculators | last=Patton | first=Charles M. | journal=[[Hewlett-Packard Journal]] | publisher=[[Hewlett-Packard Company]] | location=Palo Alto, California, USA | date=August 1987 | volume=38 | issue=8 | pages=21–25 | url=http://www.hpl.hp.com/hpjournal/pdfs/IssuePDFs/1987-08.pdf | accessdate=2015年09月12日}}</ref>
<ref name="Wickes_1988">{{cite book | title=RPL: A Mathematical Control Language | first=William C. | last=Wickes | date=1988 | work=Proceedings Rochester Forth Conference on Programming Environments | publisher=Institute for Applied Forth Research, Inc. | location=Rochester, New York, USA | pages=27–32 | quote=Several existing operating systems and languages were considered, but none could meet all of the design objectives. A new system was therefore developed, which merges the threaded interpretation of [[Forth (programming language)|Forth]] with the functional approach of [[Lisp (programming language)|Lisp]]. The resulting operating system, known unofficially as RPL (for Reverse-Polish Lisp), made its first public appearance in June of 1986 in the [[HP-18C]] Business Consultant calculator.}}</ref>
<ref name="Schoorl_2000">{{cite web | title=HP48 Frequently Asked Questions List | first=André | last=Schoorl | date=2000年04月04日 | pages=69 | <!-- date=2015 | publisher=first=Eric | last=Rechlin | -->publisher=HP Calculator Archive | orig-year=1997 | url=http://www.hpcalc.org/hp48/docs/faq/48faq-pdf.zip | accessdate=2015年09月12日}}</ref>
<ref name="FAQ48">{{cite web | title=I've heard the names RPL, Saturn, STAR, GL etc... What are they? - RPL | work=FAQ: 2 of 4 - Hardware, Programs, and Programming | id=8.1. | publisher=comp.sys.hp48 | date=2000年04月14日 | version=4.62 | url=http://www.faqs.org/faqs/hp/hp48-faq/part2/ | accessdate=2015年09月12日}}</ref>
<ref name="Nelson_2012">{{cite journal | title=HP RPN Evolves | first=Richard J. | last=Nelson | publisher=[[Hewlett-Packard]] | journal=HP Solve | issue=27 | date=2012年04月04日 | pages=30–32 | url=http://h20331.www2.hp.com/hpsub/downloads/HP_Calculator_eNL_04_April_2012%20(2).pdf | accessdate=2015年09月12日}}</ref>
<ref name="Jedrzejowicz_1996">{{cite book | title=A Guide to HP Handheld Calculators and Computers | first=Włodek A. C. | last=Mier-Jedrzejowicz | date=July 1991 | publisher=HHC 2011 | edition=5 | isbn=978-1888840308 | id=1888840307 | quote=RPL stands for Reverse Polish Lisp - it combined the RPN calculator language of earlier models with features of the [[Lisp (programming language)|Lisp]] and [[Forth (programming language)|Forth]] programming languages. For a time HP explained the letters RPL as an acronym for "ROM-based Procedural Language".}}</ref>
<ref name="HP_2007">{{cite web | title=HP Celebrates 35 Years of Handheld Calculator Innovation | publisher=[[Hewlett-Packard Development Company, L.P.]] | date=2007 | url=http://h20331.www2.hp.com/Hpsub/cache/457008-0-0-225-121.html | archive-url=https://web.archive.org/web/20070317053857/http://h20331.www2.hp.com/Hpsub/cache/457008-0-0-225-121.html | archive-date=2007年03月17日 | accessdate=2015年09月13日 | quote=1987: [[HP-28C]]: First full RPL calculator: In the late 1980s, HP developed a new programming language for its new series of extremely powerful calculators. By combing elements of RPN, [[Lisp (programming language)|Lisp]] and [[Forth (programming language)|Forth]], HP came up with a language called RPL (or ROM-based Procedural Language).}}</ref>
<ref name="RPL3">{{cite web | title=RPL.DOC | first=Joe K. | last=Horn | url=http://www.hpcalc.org/hp48/docs/programming/rpl3.txt | accessdate=2015年09月12日}}</ref>
<ref name="RPLMAN">{{cite web | title=RPLMan from Goodies Disk 4 | author=[[Hewlett-Packard]] | format=RPLMAN.ZIP | url=http://www.hpcalc.org/details.php?id=1743<!-- http://www.hpcalc.org/hp48/docs/programming/rplman.zip--> | accessdate=2015年09月12日}}</ref>
<ref name="Wickes_1991">{{cite web | title=RPL stands for Reverse Polish Lisp | first=William C. | last=Wickes | publisher=www.hpcalc.org | date=1991年03月11日 | url=http://www.hpcalc.org/hp48/docs/programming/rpl.txt | accessdate=2015年09月12日 | quote=RPL stands for Reverse Polish Lisp. In the early days of RPL development, we got tired of calling the unnamed system "the new system", and one of the development team came up with "RPL", both as a play on "RPN" which has been the loved/hated hallmark of HP calcs forever, and as an accurate indication of the derivation of the language from [[Forth (programming language)|Forth]] and [[Lisp (programming language)|Lisp]].<br/>RPL was never particularly intended to be a public term; at the time of the [[HP Journal]] article (August 1987) on the [[HP-28 series|HP 28C]] there was an attempt to create a less whimsical name--hence "ROM-based procedural language," which preserved the initials but had a more dignified sound. The development team never calls it anything but (the initials) RPL. You can choose either of the two full-word versions that you prefer. Or how about "Rich People's Language?" Bill Wickes, HP Corvallis.}}</ref>}}

== 参考文献 ==
* {{cite book|title=HP&nbsp;48G Series – User's Guide (UG)|url=http://www.hpcalc.org/details.php?id=3937|edition=8th|date=December 1994|publisher=[[Hewlett-Packard]]|id=HP 00048-90126, (00048-90104)|access-date=2015年09月06日|orig-year=1993<!-- edition 1 (1993-05) -->|dead-url=no|archive-url=https://web.archive.org/web/20160806145719/http://www.hpcalc.org/details.php?id=3937|archive-date=2016年08月06日}} [http://www.hpcalc.org/hp48/docs/misc/hp48gug.zip]
* {{cite book|title=HP&nbsp;48G Series – Advanced User's Reference Manual (AUR)|url=http://www.hpcalc.org/details.php?id=6036|edition=4th|date=December 1994|publisher=[[Hewlett-Packard]]|id=HP 00048-90136, 0-88698-01574-2|access-date=2015年09月06日|orig-year=1993<!-- edition 1 (1993-07) -->|dead-url=no|archive-url=https://web.archive.org/web/20160806145723/http://www.hpcalc.org/details.php?id=6036|archive-date=2016年08月06日}} [http://www.hpcalc.org/hp48/docs/misc/hp48gaur.zip]
* {{cite book|title=HP 50g graphing calculator user's guide (UG)|url=http://www.hpcalc.org/details.php?id=6512|edition=1|date=April 2006|publisher=[[Hewlett-Packard]]|id=HP F2229AA-90006|access-date=2015年09月06日}}
* {{cite book|title=HP 50g / 49g+ / 48gII graphing calculator advanced user’s reference manual (AUR)|url=http://www.hpcalc.org/details.php?id=7141|edition=2|date=2009年07月14日|publisher=[[Hewlett-Packard]]|id=HP F2228-90010|access-date=2015年09月06日|orig-year=2005<!-- first published: Edition 1 (2005–09) -->}}
* {{cite book|title=Programming in System RPL|url=http://isa.umh.es/calc/progsysrpl.pdf|edition=2|date=2002年04月24日|access-date=2016年08月16日|author-first1=Eduardo de Mattos|author-last1=Kalinowski|author-first2=Carsten|author-last2=Dominik|orig-year=1998年07月12日|dead-url=no|archive-url=https://web.archive.org/web/20160114100225/http://isa.umh.es/calc/progsysrpl.pdf|archive-date=2016年01月14日}} (Older version: [http://www.hpcalc.org/details.php?id=1758])
* {{cite book|editor-last=Rechlin|editor-first=Eric|title=An Introduction to HP&nbsp;48 System RPL and Assembly Language Programming|url=http://www.hpcalc.org/details.php?id=7114|date=2009年03月01日|access-date=2015年09月07日|author-first=James|author-last=Donnelly}}

== 外部リンク ==
* {{cite web|url=http://www.hpcalc.org/hp49/docs/programming/|title=HP 49/50 Programming Documentation Files|accessdate=2015年09月12日|date=2015|publisher=HP Calculator Archive|first=Eric|last=Rechlin|orig-year=1997}}
* {{cite web|url=http://www.hpcalc.org/hp48/docs/programming/|title=HP 48 Programming Documentation Files|accessdate=2015年09月12日|date=2015|publisher=HP Calculator Archive|first=Eric|last=Rechlin|orig-year=1997}}
* {{cite web|url=http://www.hpmuseum.org/rpl.htm|title=RPL|accessdate=2015年09月12日|date=2013|publisher=The Museum of HP Calculators (MoHPC)|first=David G.|last=Hicks|orig-year=1995}}
* {{cite web|url=http://www.rpl2.net|title=RPL/2 - a new Reverse Polish Lisp|accessdate=2015年09月12日|date=2015|first=Joël|last=Bertrand|orig-year=2009}} (a GPL licensed RPL clone)
* {{cite web|url=http://hpgcc3.org/projects/newrpl|title=newRPL|accessdate=2015年09月12日|date=2014年01月03日|first=Claudio Daniel|last=Lapilli}} (an open source RPL derivative for [[HP 50g]] etc.)

2016年12月12日 (月) 11:49時点における版

ここはMonadaisuki さんの利用者サンドボックスです。編集を試したり下書きを置いておいたりするための場所であり、百科事典の記事ではありません。ただし、公開の場ですので、許諾されていない文章の転載はご遠慮ください

登録利用者は自分用の利用者サンドボックスを作成できます(サンドボックスを作成する 解説)。

その他のサンドボックス: 共用サンドボックス | モジュールサンドボックス

記事がある程度できあがったら編集方針を確認して、新規ページを作成しましょう。

RPL言語

RPL (Reverse Polish Language)
パラダイム スタック指向、手続き型構造化プログラミングオブジェクト指向
登場時期 1984年(1986年)
設計者 ヒューレット・パッカード
型付け なし
主な処理系 UserRPL、SystemRPL
影響を受けた言語 Forth,Lisp
影響を与えた言語 なし
テンプレートを表示

ここで説明することは、コモドール社のPET/CBMコンピューター用の Reverse Polish Languageではない。コンパイル型データベースプログラミング言語である Real-time Programming Language でもない。

RPL言語(初期開発者によるとReverse Polish Lispに由来する。[2][3][4][5][6][7] 一方、HP社のマーケティングは1987年の短い期間の間、RPLから逆に ROM-based Procedural Language という意味をこじつけで作り出そうとした。[1][7][8])は、ハンドヘルド電卓のOSであり、アプリケーションプログラミング言語である。ヒューレット・パッカード社の科学技術計算グラフRPN(逆ポーランド記法)電卓のHP 28 シリーズ、HP 48 シリーズ、HP 49/50 シリーズで使われた。しかし、HP 38G、HP 39/40 シリーズのような非RPN電卓でも使用可能である。

RPL言語はRPNに基づいた構造化プログラミング言語であるが、RPNだけでなく代数式と方程式も扱える。RPL言語はスレッド化されたインタープリターとして実装されている。[9] RPL言語はForth言語と多くの類似点がある。両言語はスタック指向であり、Lispのようなリスト指向だけではない。以前のHP社のRPN電卓(4レベル固定スタック)に反して、RPL言語が使えるスタックは利用可能な電卓のRAMさえあれば、スタックのレベル数を増やせる。

RPL言語は1984年にオレゴン州コーヴァリス市の開発拠点で誕生した。アセンブリ言語でOSを実装する以前の技術を置き換えるために開発された。[10] RPL言語に対応した最後の電卓はHP 50gであり、2015年に製造終了となった。[11][12][13]

RPL言語の種類

RPL言語の中でもシステムの低レベルから中レベルまでを扱うSystem RPL(もしくはSysRPL)言語は、OSを実装する言語の一部として前述の機種だけでなくいくつかの初期のHP社電卓で使われた。 HP 48 シリーズの場合、外部ツールを使わないとSystem RPLを電卓使用者は使用できない。しかし、HP 49/50 シリーズの場合、SysRPLを使うための内蔵コンパイラを搭載している。SysRPLでコーディングを行うと深刻なクラッシュを引き起こす可能性があるので、取扱は慎重にするべきである。

RPL言語の一種である高レベル言語のUser RPL(もしくは UserRPL)は、グラフィックスアプリケーションプログラムだけでなくテキスト型のプログラムを開発するために前述の電卓で利用できる。 全てのUserRPLプログラムは内部的にはSysRPLとして記述されている。しかし、利用可能なSysRPLコマンドの中の安全なサブセットだけを使う。 UserRPLのコマンドはエラーチェックを行うので安全ではあるが、そのエラーチェックによって UserRPL プログラムは SysRPL プログラムよりも非常に動作が遅くなっている。 UserRPLコマンドのSYSEVALはUserRPLプログラムの指定された部分をSysRPLコードとして処理することを電卓に伝える。

制御構造

RPL言語は厳密な後置記法ではない。いくつかの重要な例外は存在するものの、制御構造は標準的な中置記法の言語のように見える。これらの制御構造を実装することによって、必要な時にプログラムの内部でプログラムの一部を飛ばすことができる。

スタック

RPL言語のスタックはインタプリタ上に実装されたソフトウェア的なものであり、CPUのスタックではない。 スタックの底辺がスタックレベル1であり、電卓上では"1:"と表示される。スタックレベル番号が大きいほどスタックの上になる。 スタックの出し入れ(POP/PUSH)は基本的にスタックの底辺から行われる。

RPL言語は文中でオブジェクト(数値、数式、文字列、条件式、プログラムブロックなど)に遭遇すると何も考えずにスタックにオブジェクトを入れることが動作の基本である。コマンドに遭遇したときはコマンドを実行する。 条件式、数式、プログラムブロックのような実行できるオブジェクトは条件文などのコマンドが実行する場合と、EVALコマンドで意識的に実行することがある。

条件文

IF/THEN/ELSE/END

RPL言語はIF/THEN/ELSE/END構造を使って基本的な条件分岐をサポートする。この制御構造の基本的な文法は以下のようになる。 IF condition THEN if-true [ELSE if-false] END

以下の例はスタックの底辺(スタックレベル1)の値が"1"であるかどうかをテストし、そうであれば、"1"を"Equal to one"の置き換える。

 « IF 1 == THEN "Equal to one" END »

IF文はcondition(条件)を評価するとその結果(0:偽あるいは1:真)をスタックの底辺に残す。そして、その条件の結果を得るためにスタックの底辺を検証する。 この動作を利用すると、RPLはForth形式のIF文をオプションでサポートすることができる。つまりIF文の前に評価される条件を書くことができる。 IF文の条件を空にすることによって、IF文は条件実行の間にスタックの変更を行わない。そして、検証のためにスタックの底辺にある既存の結果(IF文の前に書いた条件の結果のこと。0:偽あるいは1:真)を使う。

 « 1 == IF THEN "Equal to one" END »

IFT/IFTE

IFT ("if-then")文 と IFTE ("if-then-else")文を使うことによって後置条件式を実現できる。 IFTとIFTEはそれぞれ2つまたは3つのオブジェクトをスタックから取り出す。 取り出した2つまたは3つのオブジェクトの最上位のオブジェクトは真偽値として評価される。もしも真ならば、上から2番目のオブジェクト("then"に相当)はスタックに戻される。 IFTEは上から3番目の"else"に相当するオブジェクトを必要とする。偽の場合、そのオブジェクトがスタックに戻される。 以下の例は、IFT文の例である。スタックの底辺から1つのオブジェクトを取り出し、それが1ならば、1を"One"に置き換える。

(説明)'1 =='と"One"が2つのオブジェクトである。これらは順番にスタックに入れられる。RPL言語は文中にオブジェクトが登場すると何も考えずにスタックにオブジェクトを押し込むことが動作の基本である。コマンドがあるときだけコマンドを実行する。IFT文はこの2つのオブジェクトをスタックから取り出す。そして、'1 =='の右辺はスタックの底辺を暗黙で意味するので、何も書かれていない。つまり、IFT文が取り出す2つのオブジェクトの上に'1 =='の右辺に相当するオブジェクトも必要である。そのオブジェクトはプログラム実行前にユーザーが自分でスタックに入れる必要がある。

 « 1 == "One" IFT »

以下の例はIFTE文の例である。スタックの底辺からオブジェクトを取り出し、それが1と等しいならば、1を"One"に置き換える。それが1でない場合は、それを"Not one"に置き換える。 « 1 == "One" "Not one" IFTE »

 « 1 == "One" "Not one" IFTE »

IFTとIFTEは引数として与えられたプログラムブロック(最初の行と最後の行以外の« »で囲まれたところ)を評価する。

(説明)RPL言語はオブジェクトと見なしたものはそれがプログラムブロックでも実行しないでスタックに入れる。そのため、評価(evaluate)されるまで実行されない。

その動作を利用することによって、IF/THEN/ELSE/END構造よりもさらにコンパクトな条件文を作ることができる。

以下の例はスタックの底辺からオブジェクトを取り出して、それが1と等しいのか、1より小さいのか、1より大きいのかを判断してからそれを"One"、"Less"、"More"のどれかに置き換える。

«
 DUP 1 ==
 « DROP "One" »
 « 1 < "Less" "More" IFTE »
 IFTE
»

CASE/THEN/END

より複雑な条件論理式をサポートするためにRPL言語は複数の条件から排他的に1つの条件を選ぶテストを実行するCASE/THEN/END構造を提供する。 CASE文の中の1つだけの選択肢が実行される。この構造の基本文法は以下のようになる。

CASE 
 condition_1 THEN if-condition_1 END 
 ...
 condition_n THEN if-condition_n END
 if-none
END

以下のコードは CASE/THEN/END 構造の使用方法を説明している。 スタックの底辺にある1文字を取得して、それに対応する文字列をそれと置き換える。対応する文字がない場合は"Unknown letter"で置き換える。

 « 
 CASE 
 DUP "A" == THEN "Alpha" END
 DUP "B" == THEN "Beta" END
 DUP "G" == THEN "Gamma" END
 "Unknown letter"
 END
 SWAP DROP @ Get rid of the original letter
»

上のコードは以下のIF/THEN/ELSE/END構造を入れ子にしたものと等価である。

 «
 IF DUP "A" ==
 THEN
 "Alpha"
 ELSE 
 IF DUP "B" == THEN
 "Beta"
 ELSE 
 IF DUP "G" == THEN
 "Gamma"
 ELSE
 "Unknown letter"
 END
 END 
 END
 SWAP DROP @ Get rid of the original letter
»

ループ文

FOR/NEXT

RPL言語はあるインデックス値から他のインデックス値までループするためのFOR/NEXT文を提供する。 ループ用のインデックス値はループ内でプログラムからアクセス可能な一時的ローカル変数(インデックス変数)に格納される。 FOR/NEXTブロックの文法は以下のようになる。

index_from index_to FOR variable_name loop_statement NEXT

以下の例は1から10までの数値を合計するためにFORループを使っている。 FORループのインデックス変数は"I"である。

 « 
 0 @ Start with zero on the stack
 1 10 @ Loop from 1 to 10
 FOR I @ "I" is the local variable
 I + @ Add "I" to the running total
 NEXT @ Repeat...
»

(説明)FORループの中で'I +'という記述がある。最初の"I"はインデックス変数であり、1から10の値をとる。"I"はオブジェクトでもあるので、無条件にスタックに入れられる。次の+はコマンドである(多くの言語では+を演算子とするが、RPL言語ではコマンド扱い)。+コマンドはスタックから2つのオブジェクトを取り出して加算して、その結果をスタックに入れる。I=1のとき、スタックの底辺に0が入っているので、0 + 1 = 1 となり、結果の1をスタックに入れる。I=2のとき、スタックの底辺に1が入っているので、1 + 2 = 3 となり、結果の3をスタックに入れる。この繰り返しで1から10までの数値を合計する。

START/NEXT

START/NEXTブロックは開始インデックスから終了インデックスまでを実行する単純な構造のために使われる。 FOR/NEXTループと違って、インデックス変数(ループ変数)はプログラムから利用できない。しかし、インデックス変数は内部的に存在する。 NEXTコマンドはインデックス変数を+1するだけである。 START/NEXTブロックの文法は以下のようになる。

 index_from index_to START loop_statement NEXT

FOR/STEP and START/STEP

FOR/NEXTとSTART/NEXTは1回のループでインデックス変数を+1することしかできない。 しかし、NEXTを増分値とSTEPで置き換えると、インデックス変数は+1以外の値で増やしたり減らしたりできる。 例えば、以下のループはインデックス変数を1回のループ毎に-2減算することによって、10から2へ逆行するようにループする。

 « 10 2 START -2 STEP »

WHILE/REPEAT/END

RPL言語のWHILE/REPEAT/ENDブロックはループの開始地点で条件テストをする回数未定のループをサポートする。 WHILE/REPEAT/ENDブロックの文法は以下のようになる。

 WHILE condition REPEAT loop_statement END

DO/UNTIL/END

RPL言語のDO/UNTIL/ENDブロックはループの最後で条件テストをする回数未定のループをサポートする。 DO/UNTIL/ENDブロックの文法は以下のようになる。

 DO loop_statement UNTIL condition END

出典

引用エラー: <references> で定義されている name "HPJ38" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "Wickes_1988" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "Schoorl_2000" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "FAQ48" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "Nelson_2012" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "Jedrzejowicz_1996" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "HP_2007" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "RPL3" の <ref> タグは、先行するテキスト内で使用されていません。
引用エラー: <references> で定義されている name "RPLMAN" の <ref> タグは、先行するテキスト内で使用されていません。

引用エラー: <references> で定義されている name "Wickes_1991" の <ref> タグは、先行するテキスト内で使用されていません。

参考文献

外部リンク

AltStyle によって変換されたページ (->オリジナル) /