О хитростях .ENVIRONMENT

Автор: Виктор Смирнов

Дата: 06.05.2015

Источник: vasm.livejournal.com

Оказывается Object REXX позволяет очень простым, но почему-то не документированным способом определить к какому семейству относится операционная система, под которой выполняется приложение. А сделать это можно с помощью предопределённого в .ENVIRONMENT глобального объекта .SYSTEM, элементы которого как раз и содержат информацию об операционной системе.

---


Например, таким образом:
 

Тест № 1.



 /* Sample1 - show the operating system name */
 parse version _ver
 say _ver
 
 say ''
 say 'My Operating System is '||.system~name
 exit;
 

Результаты выполнения теста для различных операционных систем.
 

The Operating System/2 v4.50



 OBJREXX 6.00 18 May 1999
 
 My Operating System is OS/2


Microsoft Windows 7



 REXX-ooRexx_4.2.0(MT)_32-bit 6.04 22 Feb 2014

 My Operating System is WindowsNT


OpenSUSE Linux 13.1



 REXX-ooRexx_4.2.0(MT)_64-bit 6.04 29 Dec 2013
 
 My Operating System is LINUX

А это приложение выводит на экран информацию о всех элементах объекта .ENVIRONMENT в вашей системе, попутно раскрывая все существующие в нём элементы типа Directory:
 

Тест № 2.



 /* Sample2 - check the entries of the .ENVIRONMENT object */
 parse version _ver
 say _ver
 
 say ''
 say '.ENVIRONMENT'
 say '   ITEMS='||.environment~items;
 do i over .environment
    _rc = ownSay( 'ENVIRONMENT', i, .environment[i], 3);
    if (.environment[i]~defaultname == 'a Directory') then do
       say '      ITEMS='||.environment[i]~items;
       do j over .environment[i]
          _rc = ownSay( i, j, .environment[i][j], 6);
       end;
    end;
 end;
 
 exit;
 
 ::routine ownSay
    use arg ?parent, ?child, ?obj, ?indent 
 
    _m = ' '~copies(?indent);
    _s = ?obj~string;
    if (?parent == 'ENVIRONMENT' & ?child == 'ENDOFLINE') then
       _s = '"'||_s~c2x||'"x';
    else _s = '"'||_s||'"';
    say _m||'.'||?child||'   '||?obj~defaultname||'   '|| ,
        ?obj~objectname||'   '||_s
    return .nil;
 

Ниже приведёна часть экранного вывода, относящяяся к объекту .SYSTEM, для различных систем.
 

The Operating System/2 v4.50



 OBJREXX 6.00 18 May 1999
 
 .ENVIRONMENT
    ITEMS=36
 ...
    .SYSTEM   a Directory   a Directory   "a Directory"
       ITEMS=4
       .VERSION   a String   a String   "2.30"
       .INTNAME   a String   a String   "OS/2 Intel"
       .SOMVERSION   a String   a String   "2"
       .NAME   a String   a String   "OS/2"
 ...


Microsoft Windows 7



 REXX-ooRexx_4.2.0(MT)_32-bit 6.04 22 Feb 2014

 .ENVIRONMENT
    ITEMS=62
 ...
    .SYSTEM   a Directory   a Directory   "a Directory"
       ITEMS=3
       .NAME   a String   a String   "WindowsNT"
       .VERSION   a String   a String   "6.01"
       .INTERNALNAME   a String   a String   "WindowsNT"
 ...


OpenSUSE Linux 13.1



 REXX-ooRexx_4.2.0(MT)_64-bit 6.04 29 Dec 2013
 
 .ENVIRONMENT
    ITEMS=60
 ...
    .SYSTEM   a Directory   a Directory   "a Directory"
       ITEMS=3
       .INTERNALNAME   a String   a String   "LINUX"
       .NAME   a String   a String   "LINUX"
       .VERSION   a String   a String   "3.11.6-4-desktop"
  ...