Lokális érvényű deklarációk

11.1. Kérdés.
Nem tudja vki, hogy pontosan mi a különbség a let és a local között??

11.1. Válasz.
Oktató: A let olyan kifejezés, a local olyan deklaráció, amely felhasznál egy vagy több lokális érvényű deklarációt, röviden lokális deklarációt. Remélem, a kifejezés és a deklaráció közötti különbséget ismerik.

Egyszerű példák:

val x = let val a = 2 in a end;
local val a = 2 in val x = a end;

11.2. Kérdés.
Nagyon megköszönném, ha valaki egy teljesen konkrét példán keresztül szemléltetve pontosan elmondaná, hogy mi a különbség a lokális kifejezés és lokális deklaráció között, tehát mi az, amit csak az egyikben szabad, a másikban nem.

11.2. Válasz.
Oktató: Először is az elnevezéseket pontosítom. Korábban, többek között a jegyzet korábbi kiadásaiban valóban lokális kifejezésnek és lokális deklarációnak neveztük a let-kifejezést és a local-deklarációt, de ezek pontatlanok. Pontosabban fejezik ki a lényeget a kifejezés lokális érvényű deklarációval és a deklaráció lokális érvényű deklarációval elnevezések. Lokális érvényű helyett röviden lokálist is mondhatunk. És akkor most lássuk a jelentésüket és használatukat!

Közös mindkettőben, hogy a lokálisan, azaz a let, ill. a local és az in kulcsszók között) deklarált neveket a külvilág nem látja. A legfontosabb különbségek a következők.

Amikor egy függvénydefinícióban alkalmazzuk a let-kifejezést, a let és az in szavak közötti deklarációk a függvénydefiníció fejrésze után állnak a szövegben, ezért látják a függvényfejben szereplő paramétereket. A let-kifejezés in és end közötti részében pontosan egy kifejezésnek kell lennie.

Amikor egy függvénydefinícióban alkalmazzuk local-deklarációt, a local és az in szavak között álló deklarációk a függvénydefiníció fejrésze előtt állnak a szövegben, ezért nem látják a függvényfejben szereplő paramétereket. A local-deklaráció in és end közötti részében legalább egy deklarációnak kell lennie.

Példák:

local fun g x = 3 * x
in
   fun f (y, z) = (g y, g z)
end
Megjegyzés: A g függvény nem látja y-t, sem z-t, ezért a törzsében nem hivatkozhat rájuk.

fun f (y, z) =
        let fun g x = 3 * x * z
        in
           g y
        end
Megjegyzés: A g függvény deklarációja látja y-t is, z-t is, ezért a törzsében hivatkozhat rájuk.


Deklaratív programozás - FP-GYIK
2005. március 1.