SOUL Syntax Highlighting Examples

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
* Object-Oriented Programming in SOUL
* Demonstrates classes, objects, and methods

* Define a class
CLASS Employee
    * Properties
    PUBLIC SHARED %COMPANY_NAME IS STRING LEN 50
    PRIVATE %NAME IS STRING LEN 50
    PRIVATE %ID IS FIXED
    PRIVATE %SALARY IS FLOAT

    * Constructor
    CONSTRUCTOR(%EMP_NAME IS STRING, %EMP_ID IS FIXED)
        %NAME = %EMP_NAME
        %ID = %EMP_ID
        %SALARY = 0
    END CONSTRUCTOR

    * Public method
    PUBLIC FUNCTION GetName() IS STRING
        RETURN %NAME
    END FUNCTION

    * Method with parameters
    PUBLIC SUBROUTINE SetSalary(%NEW_SALARY IS FLOAT)
        IF %NEW_SALARY GT 0 THEN
            %SALARY = %NEW_SALARY
        END IF
    END SUBROUTINE

    * Method that returns value
    PUBLIC FUNCTION GetAnnualTax() IS FLOAT
        %TAX_RATE = 0.28
        RETURN %SALARY * %TAX_RATE
    END FUNCTION

    * Method using object methods
    PUBLIC FUNCTION GetSummary() IS STRING
        %SUMMARY = 'Employee: ' WITH %NAME
        %SUMMARY = %SUMMARY WITH ', ID: ' WITH $String(%ID)
        RETURN %SUMMARY
    END FUNCTION

    * Static method
    PUBLIC SHARED FUNCTION GetCompanyName() IS STRING
        RETURN %COMPANY_NAME
    END FUNCTION
END CLASS

* Define another class
CLASS Manager EXTENDS Employee
    PRIVATE %DEPARTMENT IS STRING LEN 30
    PRIVATE %NUM_REPORTS IS FIXED

    CONSTRUCTOR(%NAME IS STRING, %ID IS FIXED, %DEPT IS STRING)
        * Call parent constructor
        SUPER.CONSTRUCTOR(%NAME, %ID)
        %DEPARTMENT = %DEPT
        %NUM_REPORTS = 0
    END CONSTRUCTOR

    PUBLIC SUBROUTINE AddReport()
        %NUM_REPORTS = %NUM_REPORTS + 1
    END SUBROUTINE

    PUBLIC FUNCTION GetDepartment() IS STRING
        RETURN %DEPARTMENT
    END FUNCTION
END CLASS

* Using objects
%EMP1 = NEW Employee('Alice Smith', 1001)
%EMP2 = NEW Employee('Bob Jones', 1002)

* Call object methods
%EMP1:SetSalary(75000)
%EMP2:SetSalary(68000)

* Get values from object methods
%NAME1 = %EMP1:GetName()
%TAX1 = %EMP1:GetAnnualTax()

PRINT %NAME1 WITH ' tax: ' WITH %TAX1

* Access image items (similar syntax)
IMAGE PERSON
    NAME IS STRING LEN 50
    AGE IS FIXED
    ADDRESS IS STRING LEN 100
END IMAGE

%PERSON_IMG = NEW PERSON
%PERSON_IMG:NAME = 'Charlie Brown'
%PERSON_IMG:AGE = 30

* Print image item
PRINT 'Name: ' WITH %PERSON_IMG:NAME
PRINT 'Age: ' WITH %PERSON_IMG:AGE

* Create manager object
%MGR = NEW Manager('Diana Prince', 2001, 'Engineering')
%MGR:SetSalary(95000)
%MGR:AddReport()

%MGR_DEPT = %MGR:GetDepartment()
PRINT 'Manager dept: ' WITH %MGR_DEPT

* Exception handling with objects
TRY
    %RESULT = %EMP1:GetAnnualTax()
CATCH %EX
    PRINT 'Error: ' WITH %EX:ToString()
END TRY