Here's a math library sample, I didn't add comments but I think it's pretty self explanatory. HTH
<snippet>
/* math.p */
FUNCTION binAND RETURNS INTEGER ( piInt1 AS INTEGER, piInt2 AS INTEGER ):
DEFINE VAR iReturn AS INT NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.
DO i = 1 TO 32:
PUT-BITS( iReturn, i, 1 ) =
( IF GET-BITS( piInt1, i, 1 ) = 1
AND GET-BITS( piInt2, i, 1 ) = 1
THEN 1 ELSE 0 ).
END. /* i = 1 to 32 */
RETURN iReturn.
END FUNCTION. /* binAND */
FUNCTION binOR RETURNS INTEGER ( piInt1 AS INTEGER, piInt2 AS INTEGER ):
DEFINE VAR iReturn AS INT NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.
DO i = 1 TO 32:
PUT-BITS( iReturn, i, 1 ) =
( IF GET-BITS( piInt1, i, 1 ) = 1
OR GET-BITS( piInt2, i, 1 ) = 1
THEN 1 ELSE 0 ).
END. /* i = 1 to 32 */
RETURN iReturn.
END FUNCTION. /* binOR */
FUNCTION binXOR RETURNS INTEGER ( piInt1 AS INTEGER, piInt2 AS INTEGER ):
DEFINE VAR iReturn AS INT NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.
DO i = 1 TO 32:
PUT-BITS( iReturn, i, 1 ) =
( IF GET-BITS( piInt1, i, 1 ) = 1
OR GET-BITS( piInt2, i, 1 ) = 1
AND NOT ( GET-BITS( piInt1, i, 1 ) = 1
AND GET-BITS( piInt2, i, 1 ) = 1 )
THEN 1 ELSE 0 ).
END. /* i = 1 to 32 */
RETURN iReturn.
END FUNCTION. /* binXOR */
FUNCTION binNOT RETURNS INTEGER ( piInt AS INTEGER ):
DEFINE VAR iReturn AS INT NO-UNDO.
DEFINE VAR i AS INT NO-UNDO.
DO i = 1 TO 32:
PUT-BITS( iReturn, i, 1 ) =
( IF GET-BITS( piInt, i, 1 ) = 1 THEN 0 ELSE 1 ).
END. /* i = 1 to 32 */
RETURN iReturn.
END FUNCTION. /* binNOT */
/* mathprto.i */
FUNCTION binAND RETURNS INTEGER (INPUT piInt1 AS INTEGER, INPUT piInt2 AS INTEGER) IN SUPER.
FUNCTION binOR RETURNS INTEGER (INPUT piInt1 AS INTEGER, INPUT piInt2 AS INTEGER) IN SUPER.
FUNCTION binXOR RETURNS INTEGER (INPUT piInt1 AS INTEGER, INPUT piInt2 AS INTEGER) IN SUPER.
FUNCTION binNOT RETURNS INTEGER (INPUT piInt AS INTEGER) IN SUPER.
/* math.i */
&IF DEFINED( libmath ) = 0 &THEN
{libmathprto.i}
DEFINE VAR hMath AS HANDLE NO-UNDO.
hMath = SESSION:FIRST-PROCEDURE.
DO WHILE VALID-HANDLE( hMath ) AND hMath:FILE-NAME NE "math.p":
hMath = hMath:NEXT-SIBLING.
END. /* WHILE VALID-HANDLE */
IF NOT VALID-HANDLE( hMath ) THEN
RUN math.p PERSISTENT SET hMath.
THIS-PROCEDURE:ADD-SUPER-PROCEDURE( hMath ).
&ENDIF /* defined( math ) = 0 */
&GLOBAL-DEFINE math YES
/* bin.i */
&IF "{6}" <> "" &THEN
bin{1}( {2}, bin{1}( {3}, bin{1}( {4}, bin{1}( {5}, {6} ) ) ) )
&ELSEIF "{5}" <> "" &THEN
bin{1}( {2}, bin{1}( {3}, bin{1}( {4}, {5} ) ) )
&ELSEIF "{4}" <> "" &THEN
bin{1}( {2}, bin{1}( {3}, {4} ) )
&ELSEIF "{3}" <> "" &THEN
bin{1}( {2}, {3} )
&ENDIF
/* and ( dot nothing ) */
{bin.i "AND" {*}}
/* or ( dot nothing ) */
{bin.i "OR" {*}}
/* xor ( dot nothing ) */
{bin.i "XOR" {*}}
/* not ( dot nothing ) */
binNOT( {1} )
/* main.p */
{math.i}
DEFINE VAR x AS INT NO-UNDO.
x = 1.
DISPLAY {AND x 255}.
</snippet>