|
To get started with Funnel you should copy the file
/home/linuxsoft/funnel/lecture/intro.fn
to your home account. It contains an implementation
of the function sqrt
defined in the first
lecture. You can test this function by invoking the funnel
interpreter funni with the -untyped
option: funni -untyped intro.fn
.
You enter an interpreter loop which accepts Funnel
expressions as input, evaluates these expressions and
prints out the result of the evaluation. You can exit
the interpreter by entering :q
. Command
:h
gives you an overview over all interpreter
commands.
Alternatively to the interpreter you can use the Funnel
compiler funnelc directly. It compiles a Funnel source file
intro.fn
to a bytecode file intro.net
.
Do not forget to specify the -untyped
option again
when compiling dynamically typed Funnel programs.
For executing the compiled binary, the Funnel virtual
machine funnel has to be invoked: funnel intro
.
After getting familiar with the environment you should
start implementing complex numbers using records. For this task
you can copy a framework as well from
/home/linuxsoft/funnel/lecture/complex.fn
.
Your complex
number datatype should support the functions real, imag, plus, minus,
times, div, abs, conjugate
and toString
:
-
real
and imag
return the real or
imaginary part of the complex number,
-
plus, minus, times
and div
implement
basic arithmetic operations,
-
abs
returns the absolut value of the complex number,
-
conjugate
calculates the complex conjugate, and
-
toString
returns a string representation of the
complex number. Like in Java, you can use the +
operator
for string concatenation if one of the operands is a string.
Operands not beeing a string are automatically converted into
a string.
Here is a transcript of a funni session in which the
complex datatype is used:
> val I = makeComplex(0, 1)
'val I = [record id=1, adr=0, type=(real, imag, plus, minus, times, div,
abs, conjugate, toString)]'
> I.times(I).toString
"(-1, 0)"
> val t = makeComplex(4, 7).times(makeComplex(3, -1))
'val t = [record id=1, adr=0, type=(real, imag, plus, minus, times,...]'
> t.toString
"(19, 17)"
> t.div(makeComplex(5, 2)).times(makeComplex(5, 2)).toString
"(19.000002, 17.0)"
> sqrt(t.times(t.conjugate(t)).real)
25.495098