L1VM - objects tutorial

Here I will show how to write objects in Brackets for OOP. I did add a new object and objectend keyword to Brackets. With this you can declare objects and OOP like named functions. If the function name begins with an uppercase P then it is a private function.

I will show an object in my math circle program:

(circle object)
    #var ~ circle

    (set double 1 circ~ 0.0)
    (set double 1 diam~ 0.0)
    (set double 1 radius~ 0.0)
    (set double 1 area~ 0.0)

    (set string s circstr~ "circumference: ")
    (set string s diamstr~ "diameter:      ")
    (set string s radiusstr~ "radius:        ")
    (set string s areastr~ "area:          ")

(calc_diam->circle func)

The calc_diam->circle function calculates the diameter of the circle. At the beginning of the object all needed variables are declared. Here every object function must end with: ->circle, as this is the object name. To call an object function just do a normal function call as with every normal function.

Here is the full example:

// math-circle-oop.l1com
// calculate diameter or circumference of circle
// NEW: OOP style functions and private functions beginning with uppercase P
//
#include <intr.l1h>
#include <math-const.l1h>
#include <misc-macros.l1h>
(main func)
    (set int64 1 zero 0)
    (set int64 1 one 1)
    (set int64 1 two 2)
    (set int64 1 three 3)
    (set int64 1 four 4)
    (set string s menu_diamstr "1: calculate diameter of circle")
    (set string s menu_circstr "2: calculate circumference of circle")
    (set string s menu_areastr "3: calculate area of circle")
    (set string s menu_quitstr "4: quit")
    (set string s menu_chstr "? ")
    (set int64 1 input 0)
    (set int64 1 f 0)
    // -------------------------------------------------------
    (:loop)
    print_s (menu_diamstr)
    print_n
    print_s (menu_circstr)
    print_n
    print_s (menu_areastr)
    print_n
    print_s (menu_quitstr)
    print_n
    print_s (menu_chstr)
    // read input
    input_i (input)
    pull_int64_var (input)

    (switch)
        (input one ?)
            (:calc_diam->circle !)
            (break)

        (input two ?)
            (:calc_circ->circle !)
            (break)

        (input three ?)
            (:calc_area->circle !)
            (break)

        (input four ?)
            exit (zero)
            (break)
    (switchend)
    print_n
    print_n

    (:loop jmp)
(funcend)

(circle object)
    #var ~ circle

    (set double 1 circ~ 0.0)
    (set double 1 diam~ 0.0)
    (set double 1 radius~ 0.0)
    (set double 1 area~ 0.0)

    (set string s circstr~ "circumference: ")
    (set string s diamstr~ "diameter:      ")
    (set string s radiusstr~ "radius:        ")
    (set string s areastr~ "area:          ")

(calc_diam->circle func)
    #var ~ circle

    print_s (circstr~)
    // input double circ
    input_d (circ~)
    {diam~ = (circ~ / m_pimath)}
    print_s (diamstr~)
    print_d (diam~)
(funcend)
(calc_circ->circle func)
    #var ~ circle

    print_s (diamstr~)
    // input double diam
    input_d (diam~)
    {circ~ = (diam~ * m_pimath)}
    print_s (circstr~)
    print_d (circ~)
(funcend)
(calc_area->circle func)
    #var ~ circle

    print_s (radiusstr~)
    // input double radius
    input_d (radius~)
    {area~ = (m_pimath * radius~ * radius~)}
    print_s (areastr~)
    print_d (area~)
(funcend)
(objectend)