RISC OS uitgediept deel 3
een nieuwe aflevering vol toeters en bellen van Kees Grinwis

In deel 2 heb ik het gehad over Filer_Opendir en andere commando's van de bestandsbeheerder. Ik zal hier eerst nog een beetje verder op in gaan naar aanleiding van de tip die in de Asterisk (blz. 23) van januari 1999 gestaan heeft. Daarna zal ik de commando's 'Set', 'SetEval' en 'SetMacro' verder toe gaan lichten.

In de vorige Asterisk stond een tip waarmee men hetzelfde Filer-venster op 2 verschillende manieren geopend had. Het probleem was dat hierbij in principe uitgegaan werd van de root, de hoofdmap in correct Nederlands, van de harde schijf.

Als er echter gebruik gemaakt wordt van de mogelijkheid die Risc-OS biedt om paden te definiëren is het ook mogelijk om deze methode voor meer dan 2 verschillende weergave opties te gebruiken. Een ander voordeel van het gebruik van deze oplossing is het nog verder onafhankelijk maken van de naam van de harde schijf en de plaats waar de map geplaatst is.

Ook is het op deze manier mogelijk om een 2e afbeeld-methode te gebruiken voor opslagsystemen (de Engelse bena-ming is Filing System) die niet werken met een nummering van haar 'Disc's. Voorbeelden van zulke opslagsystemen zijn raFS, MemFS en SparkFS (met SparkDirs).

Deze figuur is een mooi voorbeeld van een situatie waar een pad-naam een betere oplossing is om een andere afbeeldingsmethode te gebruiken. In dit geval heb ik zelfs lichtelijk geëxperimenteerd met het gebruik van een alias. Het gevolg van mijn 'spielerei' is de volgende code:

set AsteriskSI$Path raFS::Asterisk.$.
set Alias$Filer_OpendirSI If "<%0SI$Path>"<
>"" Then %Filer_Opendir %0SI: -si %*0
Filer_OpendirSI Asterisk

Dit is een mogelijke oplossing van het probleem, er zijn echter ook nog andere leuke oplossingen mogelijk die (eventueel) betrekking hebben op 1 bepaald pad. Zo is het bijvoorbeeld mogelijk om een alias in te stellen voor het openen van het pad met de naam 'AsteriskSI:'.

Hier kunt u echter zelf wel verder mee experimenteren, ik hoop later nog wel in te gaan op de mogelijkheden die er zijn met het gebruik van de aliassen en de gerelateerde Alias$* variabelen.

Zonder dat ik het zelf gemerkt heb heb ik hiermee eigenlijk gelijk een voorbeeld van het gebruik van 'Set' geïntroduceerd. Dit is een mooi voorproefje, er zijn echter nog 2 andere commando's die de interne systeem-variabelen kunnen wijzigen of instellen, dit zijn de commando's 'SetEval' en 'SetMacro'.

'SetEval' is een heel krachtig commando waarmee het mogelijk is om veel bewerkingen die normaal alleen in BASIC mogelijk zouden zijn, op de 8-bitters bijvoorbeeld, bij RISC-OS is dit echter ook vanaf de CLI of vanuit een Obey-bestand mogelijk. De mogelijkheden die 'SetEval' biedt worden beschreven bij het commando 'Eval', het is dus voldoende om de hulp van het commando 'Eval' op te vragen waarna u deze informatie kunt gebruiken om variabelen inhoud te gaan geven met het commando 'SetEval' dat voor het overige op eenzelfde manier werk als het commando 'Set' - dit is te zien als u voor beide com-mando's de helpinformatie laat weergeven.

Ik zal het commando 'SetEval' proberen te verduidelijken met een toepassing waar ik het zelf voor gebruik. Het genereren van een variabele die (bijna) altijd de juiste disknaam bevat, deze oplossing is ooit al eens aangedragen door Jan-Jaap van der Geer. SetEval Disk$Name Obey$Dir LEFT ((LEN Obey$Dir)-8)

Deze oplossing heeft een constructie die het mogelijk maakt om de naam van de disk te wijzigen zonder dat er grote problemen komen met verwijzingen naar die disk. Wat er exact gebeurt is dat de variabele '<Disk$Name>' dezelfde inhoud krijgt als '<Obey$Dir>' alleen worden de laatste 8 tekens niet meegenomen. In mijn geval is dit '.$.!Boot' en dat zijn precies de laatste tekens die het volle-dige pad vormen ('SCSI::Fireball04 .$.!Boot') en die niet noodzakelijk zijn in de disknaam.

Noot: Iedere keer als er een Obey-bestand wordt gestart, dan zorgt de Obey-module er voor dat de interne systeem-variabele '<Obey$Dir>' wijst naar de map waar het Obey-bestand in opgeslagen is.

De voordelen van deze oplossing zijn legio, zo gebruikte ik zelf eerst een IDE schijf en zoals te zien is aan het pad nu een SCSI oplossing, door het feit dat ik betrekkelijk consequent gebruik gemaakt heb van de variabele '<Disk$Name>' is de overstap van opslagsysteem en het wijzigen van de disknaam redelijk goed verlopen. Het is ook niet voor niets dat ik het aanmaken van de variabele al doe in de !Run van de Acorn-!Boot.

Als u de helpinformatie bij het commando 'Eval' al goed bestudeerd heeft dan zult u echter nog veel meer mogelijkheden gezien hebben, naast het manipuleren van tekenreeksen (strings) is het ook mogelijk om rekenkundige bewerkingen uit te voeren op interne systeem-variablen die een getal bevatten.

Onderstaande code rekent bijvoorbeeld de huidige eeuw uit:

SetEval Eeuw (Sys$Year+99)/100¿
Echo <Eeuw>

Zoals U ziet is er veel mogelijk met het commando 'SetEval', probeer zelf nog wat te experimenteren zodat u de ware kracht van dit commando leert kennen. Naast de commando's 'Set' en 'SetEval' kent Risc-OS nog een commando dat de interne systeem-variabelen kan wijzigen en/of instellen, dit is het commando 'SetMacro'. Het verschil met de 2 andere comman-do's is dat 'SetMacro' de inhoud pas evalueert als de variabele opgevraagd wordt door bijvoorbeeld de commando's 'Echo' en 'If'. Dit biedt enorm veel voordelen, zo is het bijvoorbeeld mogelijk om aan de prompt (de systeem-variable hiervan is '<CLI$Prompt>') de huidige datum en/of tijd toe te wijzen. Als u in een taak-venster of op de commando-regel de volgende opdracht in toetst, zult u zien dat de prompt naast het vertrouwde asteriskje ook de tijd bevat.

SetMacro CLI$Prompt <Sys$Time>|M|J*

Er zijn nog andere systeem-variabelen die actuele gegevens bevatten deze zijn: '<Sys$Year>' en '<Sys$Date>'. Dit zijn niet de enige die 'on-the-fly' van gegevens worden voorzien, er zijn nog meer voorbeelden. Ook is het voor ervaren programmeurs mogelijk om met de hulp van wat ARM assembler zelf code te schrijven die een systeem-variabele van een inhoud voorziet.

Hoewel het niet in deze serie behandeld wordt kunnen hier nog interessante mogelijkheden in het verschiet liggen. Bijvoorbeeld een prompt die net als DOS de huidige map weergeeft of andere levensvergemakkelijkende zaken. (De code om de huidige map in de CLI-prompt weer te geven is overigens al gecodeerd door Dick Tanis).

Volgende keer hoop ik in te gaan op het gebruik van aliassen onder de CLI en u kunt uiteraard ook vragen stellen waar ik op in hoop te gaan. Gebruik hiervoor het e-mail adres: asterisk@dune.demon.nl. Dat was het dan weer voor deze keer, bedankt voor uw aandacht en experimenteer er rustig op los onder het motto:

'Alles kan beter'
Kees Grinwis