Linguagens funcionais ainda são pouco utilizadas comparadas com as imperativas, isso deve-se em parte a um pré-conceito que muitos ainda tem com relação a linguagens funcionais e recursividade. Atualmente um código compilado em Haskell pode ser mais rápido do que em linguagens como Python, Perl e JavaScript: The Computer Language Benchmarks Game. Entretanto, muitos dos seus recursos tem sido utilizado em implementações recentes de JavaScript, como por exemplo o JQuery:Apresentação JQUERY
Tipos recursivos
- Zero é um número.
- Se a é um número, o sucessor de a é um número.
- Zero não é o sucessor de um número.
- Dois números cujos sucessores são iguais são eles próprios iguais.
- Se um conjunto S de números contém o zero e também o sucessor de todo número de S, então todo número está em S.
Por exemplo, a seguinte definição em Haskell:
data Nat = Zero | Succ Nat
Pode ser mapeado para C:
typedef struct Nat { struct Nat* succ; }* Nat;
Nat Zero () {
return NULL;
}
Nat Succ (Nat a) {
Nat n = malloc (sizeof (Nat));
n->succ = a;
return n;
}
Operação de soma em Haskell:
soma Zero n = n
soma (Succ m) n = Succ (soma m n)
Operação de soma em C:
Nat sum (Nat a, Nat b) {
if (a == Zero () )
return b;
else
return Succ ( sum (a->succ,b) );
}
Operação de multiplicação em Haskell
mult Zero m = Zero
mult (Succ m) n = soma n (mult n m)
Operação de multiplicação em C
Nat mult (Nat a, Nat b) {
if (a == Zero () )
return Zero ();
else
return sum (b, (mult (b, a->succ)));
}
No exemplo acima destaco um dos recursos mais importantes do Haskell. Casamento de padrões. Este recurso permite construir e “deconstruir” (não é destruir) um objeto a partir do seu construtor. Mais sobre Haskell:http://www.haskell.org/
Returning function as the result of a subroutine
typedef int (*intint)(int);intint addk (int k){int f (int n){ k = k+1; return n + k; }return f;}
After that , we can use it in our programs, for example:
intint f = addk(10);printf ("%d\n", f(4)); // 14printf ("%d\n", f(4)); // 15
Lista Funcional em JavaScript
// construtoras
function Nil () {
return []
}
function Cons (e,l) {
return [e].concat (l);
}
// acesso
function empty (l) {
return l.length == 0
}
function head (l) {
return l[0]
}
function tail (l) {
return l.slice (1, l.length)
}
A partir destas operações podemos tratar o array do JavaScript como listas funcionais. A seguir é apresentado a função foldr presente em Haskell. Ela descreve um comportamento comum a diversas operações, como somatoria, produto e até mesmo a operação de inserção:
function foldr (f,z,l)
{
if (empty (l)) return z
else return f (head (l), foldr (f,z,tail (l)) )
}
function sum (l) {
return foldr (function (a, b) {return a+b},0,l)
}
function prod (l) {
return foldr (function (a, b) {return a*b},1,l)
}
function insert (e, l) {
if (empty (l) || e < head(l) ) return Cons (e, l)
else return Cons (head (l), insert (e, tail (l)))
}
function insertion_sort (l) {
return foldr (insert,[],l)
}
Usando as funções acima:
var l = Cons (8, Cons (5, Cons (10, Nil()))) // 8, 5, 10
var lo = insertion_sort (l) // 5,8, 10
JavaScript é o futuro ?
Lua – Uma linguagem interessante para conhecer
Lua é uma linguagem brasileira, desenvolvida e mantida pela PUC-Rio (http://www.lua.org/). Usada principalmente em jogos. Agora ela é a linguagem para criar a interatividade na TV digital e é a 12 linguagem mais utilizada no MUNDO, segundo tiobe index. Ela já mais utilizada que Delphi (tecnicamente não é uma linguagem), Pascal, Fortran, Matlab .. No mesmo nível que linguagem como JavaScript e Ruby. Junto com Ruby são as unicas linguagens que não nasceu nos USA e nem na Europa.
Padrões de Projetos
- Um nome, que serve como referência a um padrão de projeto, facilitando assim a comunicação e a documentação do mesmo.
- O problema, que descreve onde e quais as condições que aquele padrão pode ser aplicado.
- A solução, descrição abstrata de como usar os elementos da programação orientada a objetos na solução de um determinado problema.
- As conseqüências, que descrevem os custos e benefícios de se aplicar um padrão incluindo o impacto sobre a flexibilidade, extensibilidade ou portabilidade de um sistema.
Criando um Makefile Genérico – C++ e Haskell
CFLAGS= -I\usr\local\src
LDFLAGS= -LC:\MySQL\lib -lmysql
CC=g++
SRCS= main.cpp Hello.cpp
OBJS=$(SRCS:.cpp=.o)
TARGET= main
all: $(TARGET)
# regras para gerar o executavel
$(TARGET) : $(OBJS)
$(CC) $(OBJS) $(LDFLAGS) -o $@
# regras de compilação
.cpp.o:
$(CC) -c $< $(CFLAGS)
clean:
rm -f *.o *.hi *~
Agora, todo novo projeto é preciso apenas alterar quatro váriaveis: (1) CFLAGS, (2) LDFLAGS, (3) CC e (3) SRCS. O mesmo makefile basico pode ser usado para outros compiladores, como ghc.
HC= ghc
HC_OPTS= -fglasgow-exts
LD_OPTS= -lstdc++
CC=gcc
SRCS= Exemplo2.hs
OBJS=$(SRCS:.hs=.o)
INT=$(SRCS:.hs=.hi)
TARGET= main
all: $(TARGET)
LIB=-L/usr/lib/mysql/ -lmysqlclient
$(TARGET) : $(OBJS)
$(HC) $(LD_OPTS) -o $@ $(OBJS) $(LIB)
.o.hi:
@:
.hs.o:
$(HC) -c $< $(HC_OPTS)
clean:
rm -f *.o *.hi *~