OCaml

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa
Question book.svg
Esta página ou secção não cita nenhuma fonte ou referência, o que compromete sua credibilidade (desde fevereiro de 2014).
Por favor, melhore este artigo providenciando fontes fiáveis e independentes, inserindo-as no corpo do texto por meio de notas de rodapé. Encontre fontes: Googlenotícias, livros, acadêmicoScirusBing. Veja como referenciar e citar as fontes.
Objective Caml
Paradigma multiparadigma: imperativa, funcional, orientação a objetos
Última versão 4.00.1 (5 de Outubro de 2012)
Criado por INRIA
Estilo de tipagem: estática, implícita e forte
Dialetos: JoCaml, MetaOCaml, OcamlP3l
Influenciada por Caml, Caml Light, Standard ML, Haskell
Influenciou ATS, F#, Scala
Licença: Q Public License (compiler)
LGPL (library)
Página oficial http://caml.inria.fr/

Objective Caml, também conhecida como OCaml, é uma linguagem de programação funcional da família ML, desenvolvida pelo INRIA em 1996. Trata-se da linguagem Caml com a adição de suporte de técnicas de orientação a objetos e algumas alterações e extensões de sintaxe.

OCaml permite dois tipos de compilação, para bytecode que corre numa máquina virtual (zinc) ou para código de máquina nativo para um grande número de plataformas. Ela não é uma linguagem puramente funcional, permitindo a existência de valores mutáveis bem como de efeitos colaterais (side-effects), tipicamente existentes apenas em linguagens imperativas. Esta característica distingue-a de outras linguagens puramente funcionais, como por exemplo Haskell.

A excelência de seu compilador que tem gerado código nativo rapidamente e com excelente desempenho quanto a tempos de execução, bem como uma biblioteca base extensa, têm-lhe conquistado bastante notoriedade.

Características[editar | editar código-fonte]

  • Linguagem funcional e imperativa;
  • Fortemente e estaticamente tipada;
  • Tipos dos valores inferidos automaticamente durante a compilação;
  • Estruturação e encapsulamento de código por módulos parametrizáveis ou objectos;
  • Tipos pré-definidos como listas, tuplas ou records (sendo os últimos similares aos structs em C);
  • Orientação a objetos implementadas com um sistema de troca de mensagens;
  • Gerência automática de memória (Garbage collector).

Exemplos[editar | editar código-fonte]

Comentários[editar | editar código-fonte]

(* Comentário... *)

Olá Mundo[editar | editar código-fonte]

print_endline "Hello world!"
(* Imprime "Hello world!" *)

Funções como valores[editar | editar código-fonte]

let s x y = x + y in
let d x y = x - y in
let sq f x y = (f x y)*(f x y) in
let square_sum = sq s in
let square_dif = sq d in
print_string( string_of_int(square_sum 4 6)^ "\t" ^ string_of_int(square_dif 4 6));;
 
(* Imprime 100  4 *)

Closures[editar | editar código-fonte]

let gen_next i =
    let _add x = i+x in
    _add
;;
 
let f = gen_next 10 in
print_int (f 5);;
 
(* Imprime 15 *)

Factorial recursivo[editar | editar código-fonte]

let rec fact x =
    match x with
    |0->1
    |_ -> x*(fact (x-1))
;;
 
print_int (fact 20);;
 
(* Imprime 45350912 *)

Valores mutáveis (conhecidos como "variáveis", no estilo imperativo)[editar | editar código-fonte]

let a = ref 1;;
print_int !a;;
a:=!a+1;;
print_int !a;;
 
(* Imprime 1 e 2*)

Ver também[editar | editar código-fonte]

Ligações externas[editar | editar código-fonte]