```#Functions

# Define a fourth order polynomial
#           p(x) = 18 x^4  + 69 x^3  - 40 x^2  - 124 x - 48

p := x -> 18*x^4 + 69*x^3 - 40*x^2 - 124*x - 48;

# Think of the symbol -> as an arrow: it tells what to do with the input
# x, namely, produce the output 18*x^4 + 69*x^3 - 40*x^2 -124*x - 48. To
# functions, a subject of interest to computer science areas.

# Define a function with automatic substitutions

q:=18*x^4 + 69*x^3 - 40*x^2 - 124*x - 48;
p1:=x->q;         # A complete failure, does not define p(x)
p2:=unapply(q,x); # How to fix that problem

# Define a function using a procedure

p3:=proc(x)
RETURN(18*x^4 + 69*x^3 - 40*x^2 - 124*x - 48);
end proc;

# Computations
p(2);         # prints 384
p1(2);        # prints an expression in x, an error
p2(2), p3(2); # prints 384
p( 1/2 );
p( a+b );
simplify(%);

# Functions and expressions are different kinds of mathematical objects.
# Compare the results of the following.

p;    # function, prints p
p(x); # expression, prints polynomial in x
p(y); # expression, prints polynomial in y
p(3); # expression, prints 2541
factor(p);               # Nothing returned
factor( p(x) );          # Find 4 linear factors
solve(p(x)=0,x);         # Find the 4 roots exactly.
fsolve(p(x)=0,x);        # Find the 4 roots numerically
plot( p, -2..2 );        # Plot a function
plot( p(x), x = -2..2 ); # Plot an expression, same plot

# Functions of several variables.

f := (x,y) -> exp(-x) * sin(y);
f(1,2);
g := unapply(alpha*exp(-k*x)*sin(w*y),(x,y));
g(1,2);
alpha := 2; k := 3; g(1,2);

w := 3.5; g(1,2);
alpha := 'alpha'; g(1,2);

```