Caml

Megan00b
Ho da fare un progetto che riguarda un interprete operazionale in caml e sto letteralmente impazzendo già sulle prime cose. Scrivo qualcuno dei miei dubbi (o meglio dilemmi) e spero che qualcuno possa aiutarmi.

Si comincia con:

#type ide = Ide of string;;
#type loc = Loc of int;;

che dovrebbero rappresentare gli identificatori e le locazioni di memoria.
Poi ci sono i valori denotati, i valori memorizzati e i valori <>

#type dval = DVar of loc | DConst of eval | Unbound
  and
  mval = Mem of eval | Uninitialized
  and
  eval = Bool of bool | Int of int;;


Poi si definiscono gli ambienti e gli stores:

#type env = Env of (ide->dval)
and store = Store of (loc ->mval);;

e fin qui riesco ancora a seguire.

Poi iniziano le funzioni:
"emptyenv" si dice nella traccia testualmente:
<< evaluates to the empty store (i.e. mapping all locations to Uninitialized) >>
e la funzione è:

let emptyenv=fun()->Env(fun(Ide x)->Unbound);;

che compilata fornisce:
val emptyenv : unit -> env = <fun>

Qui ci sono i primi problemi:
1) cosa vuol dire fun()->...; io me lo sono spiegato pensando ad una funzione che prende void in ingresso
2) qualunque cosa sia "()" sembra che la funzione gli associ un env (visto il costruttore Env) che in realtà è una funzione che all'identificatore x restituisce Unbound. Problema: non riesco ad usarla questa funzione.
3) Che diavolo è unit? Nella documentazione ufficiale come nel corso che ho seguito viene usata ma non si spiega cos'è.
4) Non riesco nemmeno ad usare il tipo env. Cioè una volta che l'ho definito se io volessi creare una variabile di tipo env come cavolo la dichiaro? Ogni tentativo mi fornisce errori.

Per ora mi fermo ma ho una valanga di altre domande da porre. Grazie per la pietà che avrete di me.

Risposte
apatriarca
Ciao, non conosco OCaml ma ho un po' di esperienza con i linguaggi funzionali, in particolare Haskell, e spero di poterti essere di aiuto.

1,2,3) Il tipo unit è presente anche in haskell (e lo si indica con ()) e lo puoi interpretare come una specie di void. Dando un'occhiata ad alcuni esempi nel manuale di Ocaml sul sito sembra essere il tipo di ritorno di quelle funzioni con side-effect e quindi avere lo stesso significato anche in questo linguaggio.

Se unit ha lo stesso significato che ha in haskell allora è un tipo che può assumere un solo valore () e quindi ritengo che si debba scrivere emptyenv() per utilizzarlo (alcuni esempi che ho trovato online sembrano confermare l'uso di funzioni richiamate in questo modo...).

4) Non basta fare come nella definizione di emptyenv (Env (fun(Ide x)->Unbound))?

apatriarca
Dopo aver scritto la mia risposta ho scaricato OCaml e mi sono messo a giocare un po’ per verificare quello che ti avevo scritto. Dal reference di Ocaml sul sito il tipo unit è definito nel modo seguente:


type unit = ()

The type of the unit value.


Come puoi notare è un tipo che può assumere un solo valore () e che viene usato quando non ci sono parametri o valori di ritorno. Non ha niente di particolare. Unit può essere sia il valore di ritorno sia essere il parametro di una funzione. Per esempio ho digitato le righe seguenti nell’interprete con i seguenti risultati:

# let a = function () -> 4;;
val a : unit -> int = <fun>
# a();;
- : int = 4
# let a2 () = 7;;
val a2 : unit -> int = <fun>
# a2 ();;
- : int = 7
# let b n = ();;
val b : 'a -> unit = <fun>
# b 6;;
- : unit = ()
# b "Ciao mondo";;
- : unit = ()


Spero che insieme a questi esempi sia tutto un po’ più chiaro. Ho provato il tuo codice sul mio PC e non ho avuto problemi ad usare emptyenv, né a creare un Env con una funzione differente. [/quote]

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.