### User defined functions

To define functions by an user himself, `def' statement must be used. Syntactical errors are detected in the parsing phase of Asir, and notified with an indication of where Asir found the error. If a function with the same name is already defined (regardless to its arity,) the new definition will override the old one, and the user will be told by a message,

```afo() redefined.
```

on the screen when a flag `verbose` is set to a non-zero value by `ctrl()`. Recursive definition, and of course, recursive use of functions are available. A call for an yet undefined function in a function definition is not detected as an error. An error will be detected at execution of the call of that yet undefined function.

```
def f(X) {
if ( !X )
return 1;
else
return X * f(X-1);
}

def c(N)
{
A = newvect(N+1); A = B = newvect(1); B = 1;
for ( K = 1; K <= N; K++ ) {
A[K] = B = newvect(K+1); B = B[K] = 1;
for ( P = A[K-1], J = 1; J < K; J++ )
B[J] = P[J-1]+P[J];
}
return A;
}
```

In the second example, `c(N)` returns a vector, say `A`, of length `N+1`. `A[I]` is a vector of length `I+1`, and each element is again a vector which contains as its elements.

In the following, the manner of writing Asir programs is exhibited for those who have no experience in writing C programs.