Tipy & triky při použití RPN32

Téma dne

V úvodu kapitoly Příklady ilustrující použití programové vrstvy RPN32 je řada odkazů na ukázkový program rpn32. Také je tam psáno, že tento ukázkový program není předmětem zájmu zmíněné ilustrační kapitoly. To vše je pravdou. Různé finesy při spouštění rpn32 jsou totiž hlavním tématem tohoto textu.


Omluva čtenářům

Bylo by krajně nekorektní nechat čtenáře, kteří „oblibují“ operační systém Windows, tento text dočíst až do konce. Jich se tato problematika ani v nejmenším netýká a jejich závěrečný údiv a rozčarování z času promrhaného četbou by byl logickou tečkou („za tím naším případem“, jak by jistě dodal inspektor Trachta :-). Nechť je tedy na úvod vyřčena férová omluva a prosba:

Vážení windowsofilové a unixofobové!
V zájmu zachování vašeho duševního zdraví vyslyšte tuto úpěnlivou prosbu a dále již nečtěte. Závist uživatelům operačního systému Unix, kterou by ve vás obsah tohoto textu nevyhnutelně vyvolal, je nežádoucím společenským fenoménem, za jehož vznik by jen blázen chtěl nést odpovědnost. Věřte však, že autor těchto řádků bláznem není, i když podpůrné argumenty se pro toto tvrzení hledají jen velmi obtížně... Tisícerý dík za pochopení.


Návrat k tématu po omluvě

Program rpn32 nabízí několik různých druhů použití závislých na jeho spuštění. Tyto řádky se budou věnovat pouze jednorázovému použití v obou variantách rozlišených zdrojem prováděných RPN instrukcí:

  1. argumenty na command-line,
  2. obsah souboru.

Z nápovědy programu rpn32 je vidět, že jmenované varianty (argumenty vs. soubor) nelze vzájemně kombinovat. Dokonce ani souborů s různými částmi výsledného RPN programu nemůže být několik, ale pouze jeden. Řešení těchto nedostatků se přímo nabízí: vzít zdrojový text rpn32.c a části potřebné pro dosažení kýžených vlastností do něj jednoduše doplnit. Má to však jeden háček. Takový postup totiž zcela ignoruje trend, kterému musí být veškerá činnost v oblasti výpočetní techniky na počátku jednadvacátého století zcela podřízena. Co je tím trendem samozřejmě všichni dobře víme. Nebo ne? Dobrá tedy, slabším jedincům budiž tato mantra připomenuta: V průběhu vývojových etap, jejichž výsledkem má být programové vybavení počítače (tzv. Software, zkráceně SW - pozn. red.), je silně nedoporučeno vytvářet/modifikovat nějaký zdrojový kód počítačového programu.

Citovaný požadavek si protiřečí pouze zdánlivě. Hlavním úkolem techniků zodpovědných za tvorbu SW není tento vytvářet (jak by se leckterý laik pro nedostatek zkušeností z oboru domníval). Příslušné SW moduly je třeba stáhnout z internetu, protože „To už přece musí bejt dávno vod někoho udělaný, né?“ a také „Přece se s tím nebudu dvě hodiny psát, když to mám za tři dny pohodlně vygůglený.“ Charakteristickou vlastností takových SW bloků je, že nedělají to, co se od nich očekává. I když je základní poučka „Ty vole, hlavně nepiš žádnej kód!“ dostatečně známa, přesto i v následujícím kroku někteří méně erudovaní technici zazmatkují a začnou stažené zdrojové texty upravovat. Chyba! Správným postupem je zajistit dostatečné množství podpůrných programových modulů (ať už jimi jsou další programy, knihovny, skripty, ...) a těmito v prvním kroku stažené části SW obalit. A právě touto progresivní metodou se zabývají další řádky tohoto textu.


Řešení

Zůstane-li stranou ironický tón z předchozích odstavců, nabízí se pohled zřetelně střízlivější: pohled techniků, kteří těmi „moderními trendy“ nejsou okouzleni natolik, aby přestali u práce přemýšlet. Přemýšlení u práce s potřebným nádechem hravosti v překonávání technických problémů nezřídka vede k řešením zcela inovativním, nebo alespoň k postupům nepostrádajícím invenci. A právě k těmto ideám následující řádky alespoň vzhlížejí, když už se jich nemohou dotknout...

Každý rozumný technik pečlivě a s rozmyslem dělí vytvářený program na samostatně fungující části, které lze:

Pozn.: Mistrům světa v programování, kteří (v jazyku C) napíšou int main(int argc, char **argv), za následující „levou složenou“ bez uzardění „nadrtí“ 4000 řádků zdrojového textu než přijde „pravá složená“, je složen hold v úvodu.

Aby bylo možno navrhovaný postup snadno ověřit, je vhodné mít k dispozici jednoduchý ukázkový program. Všechny ukázky v tomto textu budou pracovat s RPN programem, který:

  1. vygeneruje řadu náhodných čísel,
  2. tuto řadu vypíše,
  3. seřadí vzestupně nebo sestupně
  4. a výsledek seřazení opět vypíše.
Pozn.: Sloveso „vypíše“ je v tomto kontextu eufemizmem. Ve skutečnosti je použita instrukce PSE pro zveřejnění obsahu X-registru RPN stacku.

Ukázkový program je složen ze tří modulů. Dva jsou zcela nezávislé, ten zbývající (kromě jiného) zajišťuje vazby mezi nimi. Který je který a jak se jmenují je bezvadně vidět z tabulky na konci tohoto dokumentu.

RPN program může mít při spuštění na RPN stacku argumenty. V X-registru je očekáváno číslo definující sekvenci řady pseudonáhodných hodnot (v angličtině obvykle seed; je-li 0, použito je 1). Y-registr udává počet generovaných pseudonáhodných hodnot (je-li menší než 2, použito je 5).


RPN program složený z více souborů

Spojení souborů .rpn zajistí utilita cat. Výsledek své činnosti (zápis do stdout) předá prostřednictvím pipe do rpn32 (čtení z stdin). Program rpn32 čte vstupní řádky stejně, jako by byly obsaženy v souboru na disku. Následují ukázky spuštění s různými argumenty. Za pozornost stojí pořadí modulů .rpn: entrypoint.rpn je vždy první.

↓   seed = 1,  count = 5,  trend = TREND_ASCENDING;

#
# cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -mkli -ri
PSE> 41_________ 5__________ 0__________ 5__________  4__________
PSE> 18467______ 4__________ 0__________ 5__________  4__________
PSE> 6334_______ 3__________ 0__________ 5__________  4__________
PSE> 26500______ 2__________ 0__________ 5__________  4__________
PSE> 19169______ 1__________ 0__________ 5__________  4__________
PSE> 26500______ 5__________ 19169______ 0__________  5__________
PSE> 19169______ 4__________ 19169______ 0__________  5__________
PSE> 18467______ 3__________ 19169______ 0__________  5__________
PSE> 6334_______ 2__________ 19169______ 0__________  5__________
PSE> 41_________ 1__________ 19169______ 0__________  5__________
RES>
#

↓   seed = 173,  count = 5,  trend = TREND_ASCENDING;

#
# cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -mkli -ri - 173
PSE> 603________ 5__________ 0__________ 5__________  4__________
PSE> 32185______ 4__________ 0__________ 5__________  4__________
PSE> 31548______ 3__________ 0__________ 5__________  4__________
PSE> 3854_______ 2__________ 0__________ 5__________  4__________
PSE> 23804______ 1__________ 0__________ 5__________  4__________
PSE> 32185______ 5__________ 23804______ 0__________  5__________
PSE> 31548______ 4__________ 23804______ 0__________  5__________
PSE> 23804______ 3__________ 23804______ 0__________  5__________
PSE> 3854_______ 2__________ 23804______ 0__________  5__________
PSE> 603________ 1__________ 23804______ 0__________  5__________
RES>
#

↓   seed = 23456,  count = 10,  trend = TREND_ASCENDING;

#
# cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -mkli -ri - 10 23456
PSE> 11100______ 10_________ 0__________ 10_________  9__________
PSE> 5347_______ 9__________ 0__________ 10_________  9__________
PSE> 6060_______ 8__________ 0__________ 10_________  9__________
PSE> 2724_______ 7__________ 0__________ 10_________  9__________
PSE> 21368______ 6__________ 0__________ 10_________  9__________
PSE> 6325_______ 5__________ 0__________ 10_________  9__________
PSE> 6912_______ 4__________ 0__________ 10_________  9__________
PSE> 19085______ 3__________ 0__________ 10_________  9__________
PSE> 21320______ 2__________ 0__________ 10_________  9__________
PSE> 735________ 1__________ 0__________ 10_________  9__________
PSE> 21368______ 10_________ 735________ 0__________  10_________
PSE> 21320______ 9__________ 735________ 0__________  10_________
PSE> 19085______ 8__________ 735________ 0__________  10_________
PSE> 11100______ 7__________ 735________ 0__________  10_________
PSE> 6912_______ 6__________ 735________ 0__________  10_________
PSE> 6325_______ 5__________ 735________ 0__________  10_________
PSE> 6060_______ 4__________ 735________ 0__________  10_________
PSE> 5347_______ 3__________ 735________ 0__________  10_________
PSE> 2724_______ 2__________ 735________ 0__________  10_________
PSE> 735________ 1__________ 735________ 0__________  10_________
RES>
#

↓   seed = 1,  count = 3,  trend = TREND_ASCENDING;

#
# cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -mkli -ri - 3 0
PSE> 41_________ 3__________ 0__________ 3__________  2__________
PSE> 18467______ 2__________ 0__________ 3__________  2__________
PSE> 6334_______ 1__________ 0__________ 3__________  2__________
PSE> 18467______ 3__________ 6334_______ 0__________  3__________
PSE> 6334_______ 2__________ 6334_______ 0__________  3__________
PSE> 41_________ 1__________ 6334_______ 0__________  3__________
RES>
#

↓   seed = 2014,  count = 6,  trend = TREND_DESCENDING;

#
# cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -mkli -ri - -6 2014
PSE> 6615_______ 6__________ 0__________ 6__________  5__________
PSE> 28130______ 5__________ 0__________ 6__________  5__________
PSE> 20415______ 4__________ 0__________ 6__________  5__________
PSE> 2078_______ 3__________ 0__________ 6__________  5__________
PSE> 7496_______ 2__________ 0__________ 6__________  5__________
PSE> 23143______ 1__________ 0__________ 6__________  5__________
PSE> 2078_______ 6__________ 23143______ 0__________  6__________
PSE> 6615_______ 5__________ 23143______ 0__________  6__________
PSE> 7496_______ 4__________ 23143______ 0__________  6__________
PSE> 20415______ 3__________ 23143______ 0__________  6__________
PSE> 23143______ 2__________ 23143______ 0__________  6__________
PSE> 28130______ 1__________ 23143______ 0__________  6__________
RES>
#

Pozn.: Pro výpis generovaných/seřazených hodnot by postačilo, aby formátovacím řetězcem byl požadován textový výstup pouze X-registru RPN stacku. Obsahy ostatních registrů však bezděčně plní úlohu chybějících oddělovačů a výpis je proto přehlednější.


Kombinace zdrojů RPN instrukcí

Viditelným nedostatkem v modulu entrypoint.rpn je pevně stanovené množství paměťových registrů na hodnotu 21 (viz úvodní pseudoinstrukce ?REG). Následující shellovská konstrukce umožní spustit RPN program stejně jako v předchozích ukázkách, ale s možností určení libovolné délky seznamu generovaných/řazených čísel.

↓   seed = 173,  count = 100,  trend = TREND_ASCENDING;

#
# rpn32 -mkli -ri `cat entrypoint.rpn randomize.rpn bubblesort.rpn | rpn32 -L. | sed 's/ //; s/^*$/x/'` ?reg101 = 100 173
PSE> 603________ 100________ 0__________ 100________  99_________
PSE> 32185______ 99_________ 0__________ 100________  99_________
PSE> 31548______ 98_________ 0__________ 100________  99_________
PSE> 3854_______ 97_________ 0__________ 100________  99_________
PSE> 23804______ 96_________ 0__________ 100________  99_________
PSE> 2993_______ 95_________ 0__________ 100________  99_________
PSE> 22531______ 94_________ 0__________ 100________  99_________
PSE> 17387______ 93_________ 0__________ 100________  99_________
PSE> 16139______ 92_________ 0__________ 100________  99_________
PSE> 15572______ 91_________ 0__________ 100________  99_________
PSE> 13033______ 90_________ 0__________ 100________  99_________
PSE> 2953_______ 89_________ 0__________ 100________  99_________
PSE> 30080______ 88_________ 0__________ 100________  99_________
PSE> 11979______ 87_________ 0__________ 100________  99_________
PSE> 25925______ 86_________ 0__________ 100________  99_________
PSE> 754________ 85_________ 0__________ 100________  99_________
PSE> 28169______ 84_________ 0__________ 100________  99_________
PSE> 2585_______ 83_________ 0__________ 100________  99_________
PSE> 24799______ 82_________ 0__________ 100________  99_________
PSE> 21216______ 81_________ 0__________ 100________  99_________
PSE> 29778______ 80_________ 0__________ 100________  99_________
PSE> 23117______ 79_________ 0__________ 100________  99_________
PSE> 30548______ 78_________ 0__________ 100________  99_________
PSE> 27015______ 77_________ 0__________ 100________  99_________
PSE> 21636______ 76_________ 0__________ 100________  99_________
PSE> 13948______ 75_________ 0__________ 100________  99_________
PSE> 12476______ 74_________ 0__________ 100________  99_________
PSE> 1718_______ 73_________ 0__________ 100________  99_________
PSE> 1804_______ 72_________ 0__________ 100________  99_________
PSE> 19950______ 71_________ 0__________ 100________  99_________
PSE> 30089______ 70_________ 0__________ 100________  99_________
PSE> 19998______ 69_________ 0__________ 100________  99_________
PSE> 18845______ 68_________ 0__________ 100________  99_________
PSE> 11544______ 67_________ 0__________ 100________  99_________
PSE> 4018_______ 66_________ 0__________ 100________  99_________
PSE> 21489______ 65_________ 0__________ 100________  99_________
PSE> 18808______ 64_________ 0__________ 100________  99_________
PSE> 20170______ 63_________ 0__________ 100________  99_________
PSE> 18194______ 62_________ 0__________ 100________  99_________
PSE> 22448______ 61_________ 0__________ 100________  99_________
PSE> 17131______ 60_________ 0__________ 100________  99_________
PSE> 19882______ 59_________ 0__________ 100________  99_________
PSE> 7435_______ 58_________ 0__________ 100________  99_________
PSE> 8510_______ 57_________ 0__________ 100________  99_________
PSE> 14871______ 56_________ 0__________ 100________  99_________
PSE> 18913______ 55_________ 0__________ 100________  99_________
PSE> 27502______ 54_________ 0__________ 100________  99_________
PSE> 13368______ 53_________ 0__________ 100________  99_________
PSE> 12535______ 52_________ 0__________ 100________  99_________
PSE> 22292______ 51_________ 0__________ 100________  99_________
PSE> 27295______ 50_________ 0__________ 100________  99_________
PSE> 19849______ 49_________ 0__________ 100________  99_________
PSE> 32414______ 48_________ 0__________ 100________  99_________
PSE> 1686_______ 47_________ 0__________ 100________  99_________
PSE> 25332______ 46_________ 0__________ 100________  99_________
PSE> 24376______ 45_________ 0__________ 100________  99_________
PSE> 11200______ 44_________ 0__________ 100________  99_________
PSE> 25052______ 43_________ 0__________ 100________  99_________
PSE> 3423_______ 42_________ 0__________ 100________  99_________
PSE> 32389______ 41_________ 0__________ 100________  99_________
PSE> 30836______ 40_________ 0__________ 100________  99_________
PSE> 26929______ 39_________ 0__________ 100________  99_________
PSE> 26445______ 38_________ 0__________ 100________  99_________
PSE> 30773______ 37_________ 0__________ 100________  99_________
PSE> 28472______ 36_________ 0__________ 100________  99_________
PSE> 27306______ 35_________ 0__________ 100________  99_________
PSE> 32205______ 34_________ 0__________ 100________  99_________
PSE> 32554______ 33_________ 0__________ 100________  99_________
PSE> 10550______ 32_________ 0__________ 100________  99_________
PSE> 17757______ 31_________ 0__________ 100________  99_________
PSE> 29685______ 30_________ 0__________ 100________  99_________
PSE> 10550______ 29_________ 0__________ 100________  99_________
PSE> 10182______ 28_________ 0__________ 100________  99_________
PSE> 27854______ 27_________ 0__________ 100________  99_________
PSE> 18561______ 26_________ 0__________ 100________  99_________
PSE> 11825______ 25_________ 0__________ 100________  99_________
PSE> 26419______ 24_________ 0__________ 100________  99_________
PSE> 16554______ 23_________ 0__________ 100________  99_________
PSE> 7870_______ 22_________ 0__________ 100________  99_________
PSE> 7497_______ 21_________ 0__________ 100________  99_________
PSE> 3778_______ 20_________ 0__________ 100________  99_________
PSE> 3256_______ 19_________ 0__________ 100________  99_________
PSE> 3751_______ 18_________ 0__________ 100________  99_________
PSE> 31898______ 17_________ 0__________ 100________  99_________
PSE> 25072______ 16_________ 0__________ 100________  99_________
PSE> 17676______ 15_________ 0__________ 100________  99_________
PSE> 16461______ 14_________ 0__________ 100________  99_________
PSE> 1791_______ 13_________ 0__________ 100________  99_________
PSE> 22268______ 12_________ 0__________ 100________  99_________
PSE> 21118______ 11_________ 0__________ 100________  99_________
PSE> 22140______ 10_________ 0__________ 100________  99_________
PSE> 31783______ 9__________ 0__________ 100________  99_________
PSE> 30373______ 8__________ 0__________ 100________  99_________
PSE> 858________ 7__________ 0__________ 100________  99_________
PSE> 27803______ 6__________ 0__________ 100________  99_________
PSE> 14059______ 5__________ 0__________ 100________  99_________
PSE> 26933______ 4__________ 0__________ 100________  99_________
PSE> 29785______ 3__________ 0__________ 100________  99_________
PSE> 11220______ 2__________ 0__________ 100________  99_________
PSE> 32222______ 1__________ 0__________ 100________  99_________
PSE> 32554______ 100________ 32222______ 0__________  100________
PSE> 32414______ 99_________ 32222______ 0__________  100________
PSE> 32389______ 98_________ 32222______ 0__________  100________
PSE> 32222______ 97_________ 32222______ 0__________  100________
PSE> 32205______ 96_________ 32222______ 0__________  100________
PSE> 32185______ 95_________ 32222______ 0__________  100________
PSE> 31898______ 94_________ 32222______ 0__________  100________
PSE> 31783______ 93_________ 32222______ 0__________  100________
PSE> 31548______ 92_________ 32222______ 0__________  100________
PSE> 30836______ 91_________ 32222______ 0__________  100________
PSE> 30773______ 90_________ 32222______ 0__________  100________
PSE> 30548______ 89_________ 32222______ 0__________  100________
PSE> 30373______ 88_________ 32222______ 0__________  100________
PSE> 30089______ 87_________ 32222______ 0__________  100________
PSE> 30080______ 86_________ 32222______ 0__________  100________
PSE> 29785______ 85_________ 32222______ 0__________  100________
PSE> 29778______ 84_________ 32222______ 0__________  100________
PSE> 29685______ 83_________ 32222______ 0__________  100________
PSE> 28472______ 82_________ 32222______ 0__________  100________
PSE> 28169______ 81_________ 32222______ 0__________  100________
PSE> 27854______ 80_________ 32222______ 0__________  100________
PSE> 27803______ 79_________ 32222______ 0__________  100________
PSE> 27502______ 78_________ 32222______ 0__________  100________
PSE> 27306______ 77_________ 32222______ 0__________  100________
PSE> 27295______ 76_________ 32222______ 0__________  100________
PSE> 27015______ 75_________ 32222______ 0__________  100________
PSE> 26933______ 74_________ 32222______ 0__________  100________
PSE> 26929______ 73_________ 32222______ 0__________  100________
PSE> 26445______ 72_________ 32222______ 0__________  100________
PSE> 26419______ 71_________ 32222______ 0__________  100________
PSE> 25925______ 70_________ 32222______ 0__________  100________
PSE> 25332______ 69_________ 32222______ 0__________  100________
PSE> 25072______ 68_________ 32222______ 0__________  100________
PSE> 25052______ 67_________ 32222______ 0__________  100________
PSE> 24799______ 66_________ 32222______ 0__________  100________
PSE> 24376______ 65_________ 32222______ 0__________  100________
PSE> 23804______ 64_________ 32222______ 0__________  100________
PSE> 23117______ 63_________ 32222______ 0__________  100________
PSE> 22531______ 62_________ 32222______ 0__________  100________
PSE> 22448______ 61_________ 32222______ 0__________  100________
PSE> 22292______ 60_________ 32222______ 0__________  100________
PSE> 22268______ 59_________ 32222______ 0__________  100________
PSE> 22140______ 58_________ 32222______ 0__________  100________
PSE> 21636______ 57_________ 32222______ 0__________  100________
PSE> 21489______ 56_________ 32222______ 0__________  100________
PSE> 21216______ 55_________ 32222______ 0__________  100________
PSE> 21118______ 54_________ 32222______ 0__________  100________
PSE> 20170______ 53_________ 32222______ 0__________  100________
PSE> 19998______ 52_________ 32222______ 0__________  100________
PSE> 19950______ 51_________ 32222______ 0__________  100________
PSE> 19882______ 50_________ 32222______ 0__________  100________
PSE> 19849______ 49_________ 32222______ 0__________  100________
PSE> 18913______ 48_________ 32222______ 0__________  100________
PSE> 18845______ 47_________ 32222______ 0__________  100________
PSE> 18808______ 46_________ 32222______ 0__________  100________
PSE> 18561______ 45_________ 32222______ 0__________  100________
PSE> 18194______ 44_________ 32222______ 0__________  100________
PSE> 17757______ 43_________ 32222______ 0__________  100________
PSE> 17676______ 42_________ 32222______ 0__________  100________
PSE> 17387______ 41_________ 32222______ 0__________  100________
PSE> 17131______ 40_________ 32222______ 0__________  100________
PSE> 16554______ 39_________ 32222______ 0__________  100________
PSE> 16461______ 38_________ 32222______ 0__________  100________
PSE> 16139______ 37_________ 32222______ 0__________  100________
PSE> 15572______ 36_________ 32222______ 0__________  100________
PSE> 14871______ 35_________ 32222______ 0__________  100________
PSE> 14059______ 34_________ 32222______ 0__________  100________
PSE> 13948______ 33_________ 32222______ 0__________  100________
PSE> 13368______ 32_________ 32222______ 0__________  100________
PSE> 13033______ 31_________ 32222______ 0__________  100________
PSE> 12535______ 30_________ 32222______ 0__________  100________
PSE> 12476______ 29_________ 32222______ 0__________  100________
PSE> 11979______ 28_________ 32222______ 0__________  100________
PSE> 11825______ 27_________ 32222______ 0__________  100________
PSE> 11544______ 26_________ 32222______ 0__________  100________
PSE> 11220______ 25_________ 32222______ 0__________  100________
PSE> 11200______ 24_________ 32222______ 0__________  100________
PSE> 10550______ 23_________ 32222______ 0__________  100________
PSE> 10550______ 22_________ 32222______ 0__________  100________
PSE> 10182______ 21_________ 32222______ 0__________  100________
PSE> 8510_______ 20_________ 32222______ 0__________  100________
PSE> 7870_______ 19_________ 32222______ 0__________  100________
PSE> 7497_______ 18_________ 32222______ 0__________  100________
PSE> 7435_______ 17_________ 32222______ 0__________  100________
PSE> 4018_______ 16_________ 32222______ 0__________  100________
PSE> 3854_______ 15_________ 32222______ 0__________  100________
PSE> 3778_______ 14_________ 32222______ 0__________  100________
PSE> 3751_______ 13_________ 32222______ 0__________  100________
PSE> 3423_______ 12_________ 32222______ 0__________  100________
PSE> 3256_______ 11_________ 32222______ 0__________  100________
PSE> 2993_______ 10_________ 32222______ 0__________  100________
PSE> 2953_______ 9__________ 32222______ 0__________  100________
PSE> 2585_______ 8__________ 32222______ 0__________  100________
PSE> 1804_______ 7__________ 32222______ 0__________  100________
PSE> 1791_______ 6__________ 32222______ 0__________  100________
PSE> 1718_______ 5__________ 32222______ 0__________  100________
PSE> 1686_______ 4__________ 32222______ 0__________  100________
PSE> 858________ 3__________ 32222______ 0__________  100________
PSE> 754________ 2__________ 32222______ 0__________  100________
PSE> 603________ 1__________ 32222______ 0__________  100________
RES>

↑   Pravě skončivší ukázka zpracování 100 čísel je charakteristická výrazně složitějším zápisem na command-line v porovnání s ukázkami předchozími. Zde jsou její markanty.

Na poslední ukázce jsou demonstrovány změny programu sestaveného z připravených textových souborů bez nutnosti jejich modifikací. Zde jsou zásadní změny:

  1. Pořadí modulů .rpn je jiné. Původně první entrypoint.rpn (bez návěští určujícího vstup) je nyní zařazen na poslední místo.
  2. Formou argumentu na command-line je do celého řetězce RPN instrukcí přidána instrukce LBL 7 v roli vstupního bodu celého programu.
  3. Na předchozí bod reaguje i nová option -s7 pro spuštění programu ze správného výchozího místa.

↓   seed = 98765,  count = 4,  trend = TREND_DESCENDING;

#
# alias sedrpn32="sed 's/ //; s/^*$/x/'"
# alias rpn32sed="rpn32 -L. | sedrpn32"
#
# rpn32 -mkli -ri -s7 `cat randomize.rpn bubblesort.rpn | rpn32sed` lbl7 `rpn32 -L. entrypoint.rpn | sedrpn32` ?reg5 = -4 98765
>>>> 98765______ -4_________ 0__________ 0__________  0__________
PSE> 27651______ 4__________ 0__________ 4__________  3__________
PSE> 21948______ 3__________ 0__________ 4__________  3__________
PSE> 15940______ 2__________ 0__________ 4__________  3__________
PSE> 18114______ 1__________ 0__________ 4__________  3__________
PSE> 15940______ 4__________ 18114______ 0__________  4__________
PSE> 18114______ 3__________ 18114______ 0__________  4__________
PSE> 21948______ 2__________ 18114______ 0__________  4__________
PSE> 27651______ 1__________ 18114______ 0__________  4__________
RES>
#

↑   Výstupy (stdout) programů cat a rpn32 -L. jsou přes pipe přesměrovány do dvojice dosud neznámých „programů“: rpn32sed a sedrpn32. Ve skutečnosti to žádné programy/utility nejsou. Jde o „přezdívky“ (v anglickém originálu alias, ale krkonošský spisovatel Jan Buchar by jistě použil termínu „přísrabek“ :-) nahrazující složitější zápisy při použití sed.


Návdavek

Úvod avizuje, že ukázky se budou věnovat pouze jednorázovému použití programu rpn32. To bylo splněno a celé povídání by mohlo skončit. Nabízí se však ještě jeden tip & trik.

Ukázky z kapitoly Kombinace zdrojů RPN instrukcí jsou všechny založeny na triku, kdy jednotlivé řádky souboru jsou převedeny na argumenty na command-line. Vstupní stream stdin zde není použit, zůstává „namířen“ na vstupní zařízení, tedy console. Toho lze s výhodou vyžít a RPN program vzniklý kombinací zdrojů instrukcí provozovat i v módu interaktivního provádění.

Zde ukázka:

#
# rpn32 gto7 `cat randomize.rpn bubblesort.rpn | rpn32sed` lbl7 `rpn32 -L. entrypoint.rpn | sedrpn32` ?reg5 = -4 98765 =
CMD> mem
LBL: 00
LBL: 02..05
LBL: 07
LBL: 09..13
REG: 5
RTN: 7
LOC: 28
CMD> lst
UU:00  GTO 07
09:00  LBL 09
09:01  IPUSH 4
09:02  Rup
09:03  STO .0
09:04  Rdn
09:05  LASTx
09:06  STO .1
09:07  CLx
09:08  RCL F
09:09  STO .2
09:10  Rdn
09:11  STO .3
09:12  CLx
09:13  RCL @.3
09:14  UNS
09:15  214013
09:16  *
09:17  2531011
09:18  +
09:19  STO @.3
09:20  16
09:21  SRn
09:22  0x7FFF
09:23  AND
09:24  RCL .2
09:25  STO F
09:26  CLx
09:27  RCL .1
09:28  STO L
09:29  CLx
09:30  RCL .0
09:31  Rdn
09:32  RTN
10:00  LBL 10
10:01  IPUSH 7
10:02  STO .2
10:03  x<> L
10:04  STO .6
10:05  x<> L
10:06  DEC Y
10:07  DEC Y
10:08  +
10:09  STO .3
10:10  Rdn
10:11  STO .4
10:12  Rdn
10:13  STO .5
10:14  1
10:15  RCL .3
10:16  RCL .2
10:17  x>=y?
10:18  RTN
10:19  LCN
10:20  STO .0
11:00  LBL 11
11:01  1
11:02  RCL .3
11:03  RCL .0
11:04  COUNT
11:05  -
11:06  RCL+ .2
11:07  RCL .2
11:08  LCN
11:09  STO .1
12:00  LBL 12
12:01  RCL .1
12:02  COUNT
12:03  RCL @X
12:04  INC Y
12:05  RCL @Y
12:06  ENTER
12:07  RCL- Z
12:08  FS? 10
12:09  CHS
12:10  x>0?
12:11  GTO 13
12:12  Rdn
12:13  x<>y
12:14  STO @Z
12:15  DEC Z
12:16  x<>y
12:17  STO @Z
12:18  Rup
13:00  LBL 13
13:01  Rdn
13:02  ISG .1
13:03  GTO 12
13:04  ISG .0
13:05  GTO 11
13:06  RCL .6
13:07  STO L
13:08  CLST
13:09  RCL .5
13:10  RCL .4
13:11  RTN
07:00  LBL 07
07:01  x==0?
07:02  INC X
07:03  STO 0
07:04  x<>y
07:05  CF 10
07:06  x>=0?
07:07  GTO 04
07:08  SF 10
07:09  CHS
04:00  LBL 04
04:01  DEC X
04:02  x>0?
04:03  GTO 05
04:04  CLx
04:05  4
05:00  LBL 05
05:01  INC X
05:02  STO Z
05:03  x<>y
00:00  LBL 00
00:01  CLx
00:02  XEQ 09
00:03  STO @Y
00:04  DSZ Y
00:05  GTO 00
00:06  RCL Z
00:07  IPUSH 1
00:08  STO .0
00:09  XEQ 02
00:10  RCL .0
00:11  DEC X
00:12  SGN
00:13  x<=0?
00:14  RTN
00:15  RCL .0
00:16  1
00:17  XEQ 10
00:18  RCL .0
00:19  POP
00:20  XEQ 02
00:21  RTN
02:00  LBL 02
02:01  x<>y
03:00  LBL 03
03:01  CLx
03:02  RCL @Y
03:03  PSE
03:04  DSZ Y
03:05  GTO 03
03:06  RTN
CMD> spy
>>>> 98765______ -4_________ 0__________ 0__________  0__________  UU:00  GTO 07
CMD> run-
PSE> 27651______ 4__________ 0__________ 4__________  3__________  03:03  PSE
PSE> 21948______ 3__________ 0__________ 4__________  3__________  03:03  PSE
PSE> 15940______ 2__________ 0__________ 4__________  3__________  03:03  PSE
PSE> 18114______ 1__________ 0__________ 4__________  3__________  03:03  PSE
PSE> 15940______ 4__________ 18114______ 0__________  4__________  03:03  PSE
PSE> 18114______ 3__________ 18114______ 0__________  4__________  03:03  PSE
PSE> 21948______ 2__________ 18114______ 0__________  4__________  03:03  PSE
PSE> 27651______ 1__________ 18114______ 0__________  4__________  03:03  PSE
RES> 27651______ 0__________ 18114______ 0__________  4__________  UU:00  GTO 07
CMD> modu\X\=x\Y\=y\R\2\=2a
CMD> 4321
>>>> X=4321_______  Y=27651______  R2=21948______  UU:00  GTO 07
CMD> sto2
>>>> X=4321_______  Y=27651______  R2=4321_______  UU:00  GTO 07
CMD> clst
>>>> X=0__________  Y=0__________  R2=4321_______  UU:00  GTO 07
CMD> 2
>>>> X=2__________  Y=0__________  R2=4321_______  UU:00  GTO 07
CMD> gto9
>>>> X=2__________  Y=0__________  R2=4321_______  09:00  LBL 09
CMD> run
TRC> X=2__________  Y=0__________  R2=4321_______  09:00  LBL 09
TRC> X=2__________  Y=0__________  R2=4321_______  09:01  IPUSH 4
TRC> X=2__________  Y=0__________  R2=4321_______  09:02  Rup
TRC> X=0__________  Y=2__________  R2=4321_______  09:03  STO .0
TRC> X=0__________  Y=2__________  R2=4321_______  09:04  Rdn
TRC> X=2__________  Y=0__________  R2=4321_______  09:05  LASTx
TRC> X=4__________  Y=2__________  R2=4321_______  09:06  STO .1
TRC> X=4__________  Y=2__________  R2=4321_______  09:07  CLx
TRC> X=0__________  Y=2__________  R2=4321_______  09:08  RCL F
TRC> X=1073742848_  Y=2__________  R2=4321_______  09:09  STO .2
TRC> X=1073742848_  Y=2__________  R2=4321_______  09:10  Rdn
TRC> X=2__________  Y=0__________  R2=4321_______  09:11  STO .3
TRC> X=2__________  Y=0__________  R2=4321_______  09:12  CLx
TRC> X=0__________  Y=0__________  R2=4321_______  09:13  RCL @.3
TRC> X=4321_______  Y=0__________  R2=4321_______  09:14  UNS
TRC> X=4321_______  Y=0__________  R2=4321_______  09:15  214013
TRC> X=214013_____  Y=4321_______  R2=4321_______  09:16  *
TRC> X=924750173__  Y=0__________  R2=4321_______  09:17  2531011
TRC> X=2531011____  Y=924750173__  R2=4321_______  09:18  +
TRC> X=927281184__  Y=0__________  R2=4321_______  09:19  STO @.3
TRC> X=927281184__  Y=0__________  R2=927281184__  09:20  16
TRC> X=16_________  Y=927281184__  R2=927281184__  09:21  SRn
TRC> X=14149______  Y=0__________  R2=927281184__  09:22  0x7FFF
TRC> X=32767______  Y=14149______  R2=927281184__  09:23  AND
TRC> X=14149______  Y=0__________  R2=927281184__  09:24  RCL .2
TRC> X=1073742848_  Y=14149______  R2=927281184__  09:25  STO F
TRC> X=1073742848_  Y=14149______  R2=927281184__  09:26  CLx
TRC> X=0__________  Y=14149______  R2=927281184__  09:27  RCL .1
TRC> X=4__________  Y=14149______  R2=927281184__  09:28  STO L
TRC> X=4__________  Y=14149______  R2=927281184__  09:29  CLx
TRC> X=0__________  Y=14149______  R2=927281184__  09:30  RCL .0
TRC> X=0__________  Y=14149______  R2=927281184__  09:31  Rdn
TRC> X=14149______  Y=0__________  R2=927281184__  09:32  RTN
RES> X=14149______  Y=0__________  R2=927281184__  UU:00  GTO 07
CMD> 2
>>>> X=2__________  Y=14149______  R2=927281184__  UU:00  GTO 07
CMD> xeq9
>>>> X=19327______  Y=14149______  R2=1266650723_  UU:00  GTO 07
CMD> 2
>>>> X=2__________  Y=19327______  R2=1266650723_  UU:00  GTO 07
CMD> xeq9
>>>> X=10915______  Y=19327______  R2=2862825370_  UU:00  GTO 07
CMD> bye
#

↑   Závěr výpisu (počínaje nastavením formátovacího řetězce řízení výstupu příkazem mod) ukazuje opakované spuštění části RPN programu sloužící ke generování náhodných čísel. Ale to už není žádný tip & trik, ale bohapustá obsluha programu rpn32.


Podívat, nebo rovnou stáhnout

Soubor Akce Popis
entrypoint.rpnHlavní program
randomize.rpnGenerátor náhodných čísel
bubblesort.rpnFunkce bublinkového řazení