
RPLは、ヒューレット・パッカードの科学グラフ電卓であるHP 28、48、49、50シリーズで使用される携帯型電卓のオペレーティングシステムおよびアプリケーションプログラミング言語ですが、 38、39、40シリーズなどのRPN 以外の電卓でも使用できます。内部的には、17B、18C、19B、27Sでも使用されていました。[ 3 ]
RPL はRPN に基づく構造化プログラミング言語ですが、代数式や数式を処理する能力も同様に高く、スレッド インタプリタとして実装されています。[ 4 ] RPL はForthと多くの類似点があり、どちらの言語もスタックベースであり、リストベースのLISPとも類似しています。固定の4 レベルのスタックを持っていた以前の HP RPN 電卓とは異なり、 RPL で使用される動的スタックは使用可能なRAMによってのみ制限され、固定サイズの RPN スタックのようにスタックから引数を黙ってドロップするのではなく、メモリが不足すると電卓はエラー メッセージを表示します。[ 5 ]
RPLは、1984年にHPのオレゴン州コーバリスの開発施設で、それまで行われていた電卓のオペレーティングシステムをアセンブリ言語で実装する慣習に代わるものとして誕生しました。[ 3 ] RPLを内部的に使用した最初の電卓はHP-18Cで、ユーザーが利用できるようになった最初の電卓はHP-28Cで、どちらも1986年のものです。[ 6 ] [ 3 ] RPLをサポートする最後のポケット電卓であるHP 50gは、2015年に生産終了となりました。[ 7 ] [ 8 ] [ 9 ] ただし、iOSやAndroidスマートフォンを含むさまざまなオペレーティングシステムやデバイスで動作する、HPのRPL電卓をエミュレートできるエミュレータが複数存在します。また、新しい電卓上で RPL を再現および拡張するコミュニティ プロジェクトも多数存在し、newRPL [ 10 ] [ 11 ]や DB48X [ 12 ] [ 13 ]などがあり、機能を追加したり、パフォーマンスを向上させたりする可能性があります。[ 14 ]
RPL の内部低レベルから中レベル版であるSystem RPL (またはSysRPL ) は、一部の初期の HP 電卓や前述の電卓で、オペレーティングシステム実装言語の一部として使用されています。HP 48 シリーズでは、この RPL 版は外部ツールを使用しない限り電卓ユーザーがアクセスできませんが、HP 49/50 シリーズでは SysRPL を使用するためのコンパイラが ROM に組み込まれています。SysRPL でコーディング中に深刻なクラッシュを引き起こす可能性があるため、使用には注意が必要です。高レベルのUser RPL (またはUserRPL ) 言語は、テキストおよびグラフィカルなアプリケーション プログラムを開発するために、前述のグラフ電卓で使用できます。すべての UserRPL プログラムは内部的には SysRPL プログラムとして表現されますが、使用可能な SysRPL コマンドの安全なサブセットのみを使用します。ただし、UserRPL コマンドの一部であるエラー チェックにより、UserRPL プログラムは同等の SysRPL プログラムよりも著しく遅くなります。 UserRPLコマンドSYSEVALは、電卓に対してUserRPLプログラムの指定された部分をSysRPLコードとして処理するように指示します。
RPLの制御ブロックは厳密には後置記法ではありません。いくつかの注目すべき例外はありますが、制御ブロックの構造は標準的な中置記法言語と同様の形式をとります。電卓は、必要に応じてこれらのブロックの実装がプログラムの流れを先に進むようにすることで、この問題を解決しています。
RPLは、IF/THEN/ELSE構造による基本的な条件テストをサポートしています。このブロックの基本的な構文は次のとおりです。
条件が真の場合、偽の場合、終了
次の例は、スタックの一番下の数字が「1」かどうかをテストし、もしそうであれば「1に等しい」に置き換えます。
« IF 1 == THEN "1に等しい" END »
IF構文は条件を評価し、その結果をスタックの最下部でテストします。そのため、RPLはオプションでFORTHスタイルのIFブロックをサポートでき、ブロックの前に条件を判定できます。条件を空のままにすると、IF文は条件実行中にスタックに変更を加えず、テストにはスタックの最下部にある既存の結果を使用します。
« 1 == IF THEN "1に等しい" END »
後置条件テストは、IFT(「if-then」)関数とIFTE(「if-then-else」)関数を使用して実行できます。
IFTとIFTEは、それぞれスタックから2つまたは3つのコマンドをポップします。最上位の値はブール値として評価され、真であれば、2番目に上位の値がスタックに戻されます。IFTEでは、ブール値が偽の場合にスタックに戻される3つ目の「else」値を指定できます。
次の例では、IFT関数を使用してスタックの一番下からオブジェクトを取り出し、それが1と等しい場合は「One」に置き換えます。
« 1 == 「1」IFT »
次の例では、IFTE 関数を使用してスタックの一番下からオブジェクトを取り出し、それが 1 と等しい場合は「One」に置き換えます。1 と等しくない場合は、「Not one」という文字列に置き換えます。
« 1 == "1" "1ではない" IFTE »
IFT と IFTE は、引数として与えられたプログラム ブロックを評価するため、IF/THEN/ELSE/END 構造よりも簡潔な条件ロジックを実現できます。次の例では、スタックの一番下からオブジェクトを取り出し、それが 1 と等しいか、1 より小さいか、1 より大きいかに応じて、「One」、「Less」、「More」のいずれかに置き換えます。
「 DUP 1 == 「ドロップ「ワン」」 « 1 < "少なく表示" "多く表示" IFTE » IFTE »
より複雑な条件ロジックをサポートするために、RPLは複数の排他的条件を処理するためのCASE/THEN/END構造を提供します。CASE文内の分岐のうち、実行されるのは1つだけです。このブロックの基本的な構文は次のとおりです。
場合 condition_1 THEN if-condition_1 END ... condition_n の場合 if-condition_n 終了 if-none 終わり
以下のコードは、CASE/THEN/ENDブロックの使用例を示しています。スタックの一番下にある文字を指定すると、その文字に対応する文字列、または「不明な文字」に置き換えます。
「 場合 DUP "A" == THEN "Alpha" END DUP "B" == THEN "Beta" END DUP "G" == THEN "Gamma" END 「不明な手紙」 終わり SWAP DROP @ 元の手紙を処分してください »
このコードは、以下のネストされたIF/THEN/ELSE/ENDブロックと全く同じです。
「 IF DUP "A" == それから "アルファ" それ以外 IF DUP "B" == THEN "ベータ" それ以外 IF DUP "G" == THEN "ガンマ" それ以外 「不明な手紙」 終わり 終わり 終わり SWAP DROP @ 元の手紙を処分してください »
RPLは、あるインデックスから別のインデックスへループするためのFOR/NEXT文を提供します。ループのインデックスは、ループ内でアクセスできる一時的なローカル変数に格納されます。FOR/NEXTブロックの構文は次のとおりです。
インデックス開始インデックス終了FOR変数名ループステートメントNEXT
次の例では、FORループを使用して1から10までの数値を合計します。FORループのインデックス変数は「I」です。
「 0 @ スタックをゼロから開始する 1 10 @ 1から10までループ FOR I @ "I" はローカル変数です I + @ 累計に「I」を追加します 次回 @ 繰り返し... »
START/NEXTブロックは、開始インデックスから終了インデックスまで実行される単純なブロックに使用されます。FOR/NEXTループとは異なり、ループ変数は使用できません。START/NEXTブロックの構文は次のとおりです。
index_from index_to START loop_statement NEXT
FOR/NEXT と START/NEXT はどちらも、ユーザー定義のステップ増分をサポートしています。終了時の NEXT キーワードを増分と STEP キーワードに置き換えることで、ループ変数はデフォルト値の +1 とは異なる値で増減します。たとえば、次のループはループインデックスを 2 減らすことで、10 から 2 までステップバックします。
「10 2 スタート -2 ステップ」
RPLのWHILE/REPEAT/ENDブロックは、ループの開始時に条件テストを行う無期限ループをサポートしています。WHILE/REPEAT/ENDブロックの構文は次のとおりです。
WHILE条件 REPEAT ループステートメント END
RPLのDO/UNTIL/ENDブロックは、ループの最後に条件テストを行う無期限ループをサポートしています。DO/UNTIL/ENDブロックの構文は次のとおりです。
ループ文を条件が満たされるまで繰り返す 終了
いくつか検討されたが、いずれも設計目標をすべて満たすことはできなかった。そこで、
Forth
のスレッド解釈と
Lispの関数型アプローチを融合させた新しいシステムが開発された。その結果生まれたオペレーティングシステムは、非公式には RPL (Reverse-Polish Lisp の略) として知られ、1986 年 6 月に
HP-18C
Business Consultant 電卓
で初めて一般に公開された。
(注:このタイトルはしばしば「RPL:数学制御言語」として引用されます。抜粋は以下でご覧いただけます。))
RPL は Reverse Polish Lisp の略です。 RPL の開発初期には、名前のないシステムを「新しいシステム」と呼ぶのに飽きてしまい、開発チームの 1 人が「RPL」という名前を思いつきました。これは、HP 電卓の愛憎入り混じる特徴である「RPN」をもじったものであり、言語が Forth
と
Lisp
から
派生したものであることを正確に示すものでした。
RPL は、特に公用語として意図されたものではありませんでした。
HP 28Cに関する
HP Journal の
記事 (1987 年 8 月)の時点では
、より気まぐれでない名前を作成しようと試みられ、その結果、頭文字は保持しつつ、より格調高い響きを持つ「ROM ベースの手続き型言語」が生まれました。開発チームは、この名称を(頭文字をとって)RPLとしか呼びません。お好みの正式名称を2種類お選びいただけます。あるいは、「金持ちの言葉」なんてどうでしょう?(ビル・ウィックス、HPコーバリス)
RPLはReverse Polish Lispの略で、以前のモデルのRPN電卓言語とLispおよびForthプログラミング言語の機能を組み合わせたものです。HPは一時期、RPLを「ROMベースの手続き型言語」の頭文字として説明していました。
1987年:
HP-28C
:初の完全なRPL電卓:1980年代後半、HPは、非常に強力な電卓の新シリーズ向けに新しいプログラミング言語を開発しました。RPN、
Lisp
、
Forth
の要素を組み合わせることで、HPはRPL(またはROMベースの手続き型言語)と呼ばれる言語を考案しました。