Ocaml

linguaxe de programación

A linguaxe Objective CAML, tamén chamado Ocaml ou O'Caml, é unha linguaxe de programación avanzada da familia das linguaxes ML, desenvolvida e distribuída polo INRIA en Francia. Ocaml admite os paradigmas de programación imperativa, programación funcional e programación orientada a obxectos.

Ocaml nace da evolución da linguaxe CAML, abreviación de Categorical Abstract Machine Language, ao integrárselle a programación con obxectos.[1]

O código fonte en Ocaml se compila en código para unha máquina virtual ou en código de máquina para diferentes arquitecturas. Este último compilador produce código comparable en eficiencia ao producido por compiladores como o da linguaxe C/C++.

Ocaml dispón dunha análise de tipos estático con inferencia de tipos, con valores funcionais de primeira clase, polimorfismo parametrizado, chamada por patróns, manexo de excepcións, recolección de lixo e outras características avanzadas.

Exemplos de código

editar

"Ola Mundo"

editar
 > print_endline "Ola, mundo !" ;;
 Ola, mundo !
 val () : unit = <fun>
 >

Este é un exemplo de uso da contorna de execución (o símbolo de entrada de datos é o ">").

Manipulación de listas

editar
  (* Listas xenéricas *)
 
  (* Lonxitude dunha lista *)
  let rec long  = function
    |[] -> 0
    |x::xs -> 1 + long xs;;
 
  (* Ordenamento por inserción *)
  (* dada unha relación de orde *)
  let rec ordenar = function
    |[] -> []
    |x::xs -> inserir x (ordenar xs)
  and inserir e = function
    |[] -> [e]
    |x::xs -> if x > e
              then e::x::xs
              else x::(inserir e xs);;

  # let l = ["A"; "vida"; "é"; "un"; "longo"; "e"; "tranquilo"; "río"];;
  - : string list =
  ["A"; "vida"; "é"; "un"; "longo"; "e"; "tranquilo"; "río"]

  # long l;;
  - : int = 8

  # ordenar l;;
  - : string list =
  ["A"; "é"; "longo"; "río"; "tranquilo"; "un"; "vida"; "e"]

Árbores

editar
 
  (* Definición dunha árbore binaria, para calquera tipo 'a ). *
  type 'a arbol = AVac | Nodo of ('a arbol * 'a 'a arbol);;. *

  let a = Nodo(AVac, 4, Nodo(AVac, 2, AVac));;
 
  (* Altura da árbore *)
  let rec altura = function
    |AVac -> 0
    |Nodo(i, _, d) -> 1 + max (altura i) (altura d)  ;;
 
  # altura a;;
  - : int = 2

Funcións locais e alcance de variables

editar
 let elefantes n =
   let rec companneros m =
      if m<=n then begin
         print_int m;
         print_string "5 elefantes bambeaban sobre a tea dunha araña.@n/*n";
         print_string "Como vían que resistía, foron buscar un camarada.@n/*n";
         companneros (m+1)
    end in
      print_string "1 elefante bambeaba sobre a tea dunha araña.@n/*n";
      print_string "Como vía que resistía, foi buscar un camarada.@n/*n";
      companneros 2
  ;;
  elefantes 99 ;;

Máis exemplos no intérprete

editar
> let f x e = x + e ;;
val f : int -> int -> int = <fun>
> f 3 4 ;;
- 7 : int = <fun>
> let g x = f 3 ;;
val g : int -> int = <fun>
> g 9 ;;
- 12 : int = <fun>
> let ou =object   val x= 3     method f e = x + e    end;;
val ou :  < f  : int -> int > = <obj>
> let ou x e = x#f e ;;
val ou : < f : 'a -> 'b; .. > -> 'a -> 'b = <fun>
> ou ou 4 ;;
- : int = 7
> class add i =
  object
      val mutable x = i
      method f e = x + e
      method set k = x <- k
  end
  ;;
class add :
  int ->
  object
   val mutable x : int
   method f : int -> int
   method set : int -> unit
  end
> let more = new add 3 ;;
val more : add = obj
> (ou more 4) + (ou ou 5) ;;
- : int = 15
> more#set 6 ;;
- : unit = ()
  1. A brief history of Caml (as I remember it)

Ligazóns externas

editar