← Back to team overview

sslug-teknik team mailing list archive

Re: [OT] Sprog - Re: [TEKNIK] Delphi?

 

Mads Bondo Dydensborg <madsdyd@xxxxxxxxxxxx> writes:

> ... ved at skrive (i ML):
> 
> fun fak n = if (n <= 0) then 1 else n * fak (n - 1)
> 
> (Pånær syntaks).

Det er syntaktisk fuldstændig korrekt. Man kunne, for pænheds
skyld, fjerne parentesen omkring n <= 0.


> De fleste ML oversættere ville optimere ovenstående halerekursive funktion
> til noget der minder mere om en while løkke. Dette kan jeg ikke
> umiddelbart skrive i ML (men oversætteren kan), 

Du kan sagtens skrive while løkker i SML, men det er hverken pænt
eller anbefalelsesværdigt[1]. F.eks. følgende funktion der minder lidt
om din Pascal version (og bruger referencer og den slags utøj):

let fun fak n =
    let val nref = ref n
        val resref = ref 1
    in  while !nref > 0 do
           (resref := !resref * !nref;
	    nref := !nref - 1);
        !resref
    end
in  fak 5
end

Herligt at se SML diskuteret i lidt bredere kredse (men du er selvfølgelig
også en DIKU-person :-)).


[1] while er det der hedder en afledt form i Standard ML. Det betyder
at Definition ikke specificerer hvordan den skal types og evalueres,
men i stedet fortæller hvordan man oversætter den til et lidt mindre
``kernesprog'' (the Bare language); de foreskriver faktisk den
halerekursive version.


Mvh
--Henning Niss


Follow ups

References