Examples of Som language
Example 1  From macro package
//
e1 is the body of macro def, e2 is the actual arg list
to subst e1 e2 =
    if e1 == NIL
       
NIL
    else if isatom
e1
       
mapAtom e1 e2
    else if isatom
car e1
       
cons (mapAtom car e1 e2) (subst cdr e1 e2)
    else
       
cons (subst car e1 e2) (subst cdr e1 e2)
Example 2   Pack characters into string
//
pack array of char to som-string s1, use nested if
to strpack s1 ar start len | a k
i e =
    k = 0
    i = start
    e = start + len
    while i < e
       
a = ar[i] << 24
       
i = i + 1
       
if i < e
           
a = a | (ar[i] << 16)
           
i = i + 1
           
if i < e
               
a = a | (ar[i] << 8)
               
i = i + 1
               
if i < e
                   
a = a | ar[i]
                   
i = i + 1
       
s1[k] = a
       
k = k + 1
    s1[k] = 0
Example 3   Count number of elements in a list
to
countlis lis | i n =
    n = 0
    for i 1
(sizeoflis lis)
       
if lis[i] != 0
           
n = n + 1
    n
Example 4   Excerpt from Lexical analyser
to
lex | oldline =
    case lexstate
       
1:    // normal
           
oldline = line
           
lex1
           
oldtok = tok
           
if tok == tkEOF     // out BE til match
           
...
       
2:    // forward
           
tok = oldtok
           
lexstate = 1
       
3:    // backward
           
if tokcol >= colstk[colsp]
               
tok = oldtok
               
lexstate = 1
           
else
               
tok = tkBE
               
popcol
Example 5  Matrix multiplication with macro
:
index i j = (i * N) + j    // this is a macro
to matmul | i j s k =
    for i 0 N-1
       
for j 0 N-1
           
s = 0
           
for k 0 N-1
               
s = s + (a[index i k] * b[index k j])
           
c[index i j] = s
End