A HUME programozási nyelv

Példaprogramok



Szintaxis

Az alábbi példá a HUME egy egyszerűsített, általános szintaxisát mutatja be:

program ::= decl1 ; . . . ; decln n ≥ 1
decl ::= box | function | datatype | exception | wire | device

datatype ::= data id α1 . . . αm = constr1| . . . | constrn n ≥ 1
constr ::= con τ1 . . . τn n ≥ 1

exception ::= exception id [ :: τ ]

wire ::= wire link1 to link2 [ initially cexpr ]
link ::= connection | deviceid
connection ::= boxid . varid

box ::= box id ins outs fair/unfair matches
[ handle exnmatches ]

ins/outs/ids ::= ( id1 , . . . , idn )

matches ::= match1 | . . . | matchn n ≥ 1

match ::= ( pat1 , . . . , patn ) → expr

expr ::= int | float | char | bool | string | var | *
| con expr1 . . . exprn n ≥ 0
| ( expr1 , . . . , exprn ) n ≥ 2
| if cond then expr1 else expr2
| let valdecl1 ; . . . ; valdecln in expr
| expr within ( time | space )

function ::= var matches
valdecl ::= id = expr

pat ::= int | float | char | bool | string | var | | * | *
| con var1 . . . varn n ≥ 0
| ( pat1 , . . . , patn ) n ≥ 2

device ::= (stream | port | fifo | memory | interrupt) devdesc

devdesc ::= id (from | to) string [ within time raising id ]

"Hello, World!"

Azt szokták mondani, hogy egy programozási nyelvről sokmindent elárul az, hogy az egyszerű kis "Hello, World!" programocska, hogyan néz ki. Nézzünk két példát erre. Az első csupán kiírja a standard output-ra a "Hello, World!" üzenetünket.

expression "Hello World\n" ;

A másodikban egy kicsit bonyolítjuk a dolgot, annak érdekében, hogy a nyelv egy kicsit többet mutasson magából. Az üzenetünket összekötjük egy számláló automatával. Ez az automata lesz a programban a doboz (box) és a hozzá tartozó drótok (wire). A számláló kezdeti értékét az input drót definiálásánál 0-ként adjuk meg. A későbbiekben a doboz az input értékre egy mintaillesztést végez, ha a számláló elérte a 99-et, akkor lenullázza, egyébként pedig növeli a számláló értékét, és kiírja a megadott outputra az üzenetünket.
-- I/O bindings
stream output to "std_out" ; -- out megadasa

-- box definition: input, output es a torzs megadasa, ez a foprogramresz, minden box kulonallo folyamatkent fut
box hello
in (count_in::int 32) -- inputok
out (count_out::int 32, shown::(string, int 32, char)) -- outputok

-- body
match -- match mintaknak illeszkedniuk kell az inputokhoz
-- a megfelelo kifejezeseknek illeszkedniuk kell a deklaralt 'out' tipushoz
-- egyedul az itt deklaralt funkcionevek az erdekesek a wiring resznel

99 -> (0, ("Hello World ", 99,'\n')) -- visszaallitja a count_out-ot 0-ra
| count -> (count +1, ("Hello World ", count,'\n')) ;

wire hello
-- inputokat kot az "in" parameterekhez
(hello.count_out initially 0) -- hello.count_out-ot koti a hello.count_in-hez, alapbol 0 az ertek

-- outputokat kot az "out" eredmenyparoshoz
(hello.count_in, output) ; -- a hello.count_out-ot koti a hello.count_in-hez, hello.shown-t pedig az output-ra

Faktoriális

Tipikus példa a faktoriális számítás a rekurzív függvények bemutatására:

program
stream output to "std_out";
type integer = int 64;
fac n = if n==0 then 1 else n*fac (n-1);

box facs
in (nin::integer)
out (nout::integer,nshow::(integer,char))
match
n -> (n+1,(fac n,'\n'));

wire facs (facs.nout initially 0) (facs.nin,output);