490 likes | 677 Views
INE5363-Programação Funcional. Prof. João Bosco da Mota Alves 2001/1 - INE/CTC/UFSC Bacharelado em Ciência da Computação. Ementa. Introdução O Paradígma de Programação Funcional A linguagem LISP O dialeto XLISPWIN Exemplo de Uso de XLISPWIN Linguagem funcional moderna: CLEAN
E N D
INE5363-Programação Funcional Prof. João Bosco da Mota Alves 2001/1 - INE/CTC/UFSC Bacharelado em Ciência da Computação
Ementa • Introdução • O Paradígma de Programação Funcional • A linguagem LISP • O dialeto XLISPWIN • Exemplo de Uso de XLISPWIN • Linguagem funcional moderna: CLEAN • Cálculo Lâmbda (l - Calculus)
Material didático • Notas de aula • OAKEY, S. Lisp para Micro. Rio de Janeiro, Editora Campus, 1986. • FRIEDMAN, D.; FELLEISEN, M. The Little LISPer (Third Edition). NJ, Macmllan Publishing, 1989. • GORDAN, G. J. Common LISP Hints (Adaptado para XLISPWIN ). Original • Software CLEAN, • STEELE, G. L. Common LISP: the Language. Digital Press, 1984.
Introdução • Linguagens de programação • Visão geral • Pontos de vista • Implicações em eficiência/produtividade • Linguagem de programação como forma de comunicação entre o usuário e o computador
Introdução Máquina Usuário Assembly Fortran
Paradígmas de Programação • Procedimental ou Procedural • Assembly, Fortran, Pascal, ... • Orientado por Objeto • Smaltalk, C++, VisualAge, Java, Delphi, ... • Programação em Lógica • Prolog, Trilogy, Parlog, ... • Funcional • Lisp, Hugs, Clean, Haskel, ...
Independência de Plataformas • Independência de plataforma • Não gerar código objeto direto • Gerar código C padrão • Compilar para máquina alvo • Vantagem • Código escrito uma única vez • Desvantagem • Trabalho adicional
Paradígma de Programação Funcional • Estuda-se paradígmas de programação comparando-se com o procedimental, pois • Foi o primeiro paradígma • É o mais difundido • Há algo com o qual comparar-se • Faremos assim
Paradígma de Programação Procedimental • Seqüência de comandos permite a transição de um estado da máquina a outro • Estado da máquina • Conjunto de valores que define a situação ou comportamento de um sistema • Exemplo • Estado1, (1, 2); estado2, (1, -4)
Paradígma de Programação Procedimental • Transição de estado int fact(int n) { int x = 1; while (n > 0) { x = x * n; n = n - 1; } return x; } Um programa C
Paradígma de Programação Procedimental • O conceito de estado está vinculado, implicitamente, ao paradígma de programação procedimental • Não possuindo significado explícito nos demais paradígmas
Paradígma Funcional • Um programa é simplesmente uma função, ou expressão, daí o nome • Sua execução significa a avaliação dessa função • Comparando com o procedimental, onde f é a função (programa)
Paradígma Funcional • Exemplo • O mesmo problema do fatorial de n, n! • Em linguagem funcional fatorial (n) = prod [1..n] • Veja que não faz sentido algum o conceito de estado da máquina
Paradígma Funcional • Sob essa visão • Não há estados • Não há atribuições • Não há seqüência de comandos • Não há repetições • Mas há recursão e funções de alta ordem
Paradígma Funcional • Pode parecer impraticável uma linguagem sem • Variáveis • Atribuições • Seqüência de comandos • Como visto aqui, isso não é verdade • Pelo contrário: facilita em muitos casos
A linguagem LISP • Principais idéias que sustentam o paradígma de programação funcional, datam da década de 30 • Cálculo Lâmbda: um formalismo matemático criado por Alonzo Church • A mais antiga implementação foi LISP, desenvolvida por McCarthy na segunda metade da década de 50
A linguagem LISP • Vamos às suas principais características • Tipos de dados • O átomo e a lista • É com apenas esses dois tipos de dados que se constroem as expressões-S, as estruturas basilares de LISP
Exemplos de átomos • atom • É um átomo, pois é um string de caracteres que começa com a letra a. Nota: Em algumas implementações, escreve-se (quote atom), ou 'atom. • carnaval • É um átomo, pois é um string de caracteres que começa com uma letra.
Exemplos de átomos • 1500 • É um átomo, pois é um string de caracteres que começa com um dígito. • 150carnavais • É um átomo, pois é um string de caracteres que começa com um dígito. • b • É um átomo, pois é um string de 1 caracter começando com letra ou dígito.
Exemplos de átomos • *figueirense$ • É um átomo, pois é um string de caracteres que começa com uma letra, um dígito ou um caracter especial que não é abre parênteses, (, ou fecha parênteses, ). • 6! • É um átomo, pois é um string de caracteres que começa com uma letra, um dígito ou um caracter especial que não é abre parênteses, (, ou fecha parênteses, ).
Exemplos de listas • (atom) • É uma lista: um átomo entre parênteses • (atom carnaval 1500) • É uma lista: coleção de átomos entre parênteses. • (atom carnaval) 1500 • Não é uma lista: duas expressões-S que não estão entre parênteses. A primeira é uma lista e a segunda é um átomo
Exemplos de listas • ((atom carnaval) 1500) • É uma lista, pois as duas expressões-S estão entre parênteses. A primeira é uma lista e a segunda é um átomo • Tente fazer alguns exercícios para fixar os conceitos de átomos e listas
Expressão-S (S-expresssion) • jbma • É uma expressão-S, pois todo átomo é uma expressão-S • (j b m a) • É uma expressão-S, pois é toda lista é uma expressão-S • ((j b m) a) • É uma expressão-S, pois é uma lista
Expressão-S • (o que seria do musica baiana se inexistisse eh oh eh oh) • É uma lista, pois é uma coleção de expressões-S entre parênteses • ((j b m) a) • Nessa lista há duas expressões-S. A lista (j b m) e o átomo a
Expressão-S • ( ) • É uma lista, pois contém zero expressões-S. Essa expressão-S especial é chamada de lista nula ou lista vazia, as vezes chamada, também, nil • ( ) • É um átomo, pois ( ) é ambos, uma lista e um átomo
Expressão-S • ( ( ) ( ) ( ) ( ) ) • É uma lista, pois é uma coleção de expressões-S entre parênteses • Agora vejamos como se representa funções em LISP
Representação de funções • LISP • Processamento de listas • Representa funções através de listas • O nome da função é sempre o primeiro elemento da lista • Veja alguns exemplos de funções representadas em LISP
Funções em LISP • f(x,y), na notação usual matemática • (f x y) • Nome da função, f, como o primeiro elemento e os demais elementos, x e y, representam os seus argumentos • (nome-da-funcao argumento1 argumento2 ...)
Funções em LISP • 3*7, usando-se a notação infixa • Em LISP, notação pré-fixa • (* 3 7)
Funções em LISP • A origem do nome LISP • LISt Processing (processamento de listas) • Exemplos de execução LISP > (+ 3 4) ; operador adição 7 ; retorno da função > (- 6 4) ; operador subtração 2 ; retorno da função > (car '(6 4)) ; função car 6 ; retorno da função > (cdr '(6 4)) ; função cdr (4) ; retorno da função
Funções em LISP • LISP só pensa naquilo • Toda vez que você fornece uma lista, a executa, a menos que você o alerte para não o fazer • Por exemplo, se você fornecer a lista (6 5 7) e a mandar executar, LISP irá retornar mensagem de erro • 6 não é uma função • Como alertá-lo, então?
Funções em LISP • Em um dos exemplos acima, solicitou-se a execução de > (car '(6 4)) • Veja que a lista que é fornecida como argumento da função car é precedida pelo símbolo “ ’ ” • Esse é o alerta: proibido avaliar • Veja histórico sobre Expressão-S nas notas de aula
Função universal como interpretador LISP • Na Teoria da Computação, é comum investigar funções universais • Exemplo, a máquina universal de Turing • É uma máquina de Turing que pode simular qualquer outra máquina de Turing que voce possa descrever • McCarthy fez exatamente isso com LISP
Função universal como interpretador LISP • Definiu uma função universal LISP • Que poderia interpretar qualquer outra função LISP • Em outras palavras • Escreveu um interpretador LISP, em LISP • Como LISP manipula apenas listas • Escrever uma função universal iria requerer desenvolver-se uma forma de representar programas LISP como estruturas de listas
Função universal como interpretador LISP • Exemplo f(x+y; u*z) • Pode ser representada na forma de lista (f (+ x y) (* u z)) • Em Algol, esse artifício era chamado de Expressão-M (M-Expression) • Aqui, M significava metalangue (metalinguagem)
Função universal como interpretador LISP • Em LISP, a expressão acima passou a ser chamada de Expressão-S (S-Expression) • Em LISP, S siginificava simbolic language (linguagem simbólica) • Nesse momento, um dos membros do grupo constatou que tinham em mãos, de fato, um interpretador
Função universal como interpretador LISP • Traduziram a função universal para Assembly e a linkaram com as sub-rotinas de manuseio de listas • E esse foi o primeiro sistema LISP • Isso requeria o uso de Expressão-S, considerado uma inconveniência temporária
Função universal como interpretador LISP • Tentaram uma melhor notação, mas nunca conseguiram completá-la, e continuaram a usar a Expressão-S • Hoje, sabe-se, que essa representação é uma das principais vantagens de LISP • LISP tornou-se a principal linguagem para IA, até os anos 70
O dialeto XLISPWIN • Símbolos representam átomos • Se você usar letras, dígitos e hífens, você estará seguro de não errar • Restrições • Não use apenas dígitos (inteiro?) • Não use um hífen inicial (inteiro negativo) • Veja alguns exemplos em XLISPWIN
O dialeto XLISPWIN a foo bar baaz-quux-garply • São exemplos de átomos em XLISPWIN • O caractere ; é para comentário • Tudo, após o mesmo e até o final da linha, é considerado comentário • É ignorado pelo interpretador
O dialeto XLISPWIN • Exemplos de funções XLISPWIN > (setq a 5) ; armazena um número, 5 ; como o valor de um símbolo, a 5 > a ; pega o valor, 5, de um símbolo, a 5
> (let ((a 6)) a) 6 > a 5 ; faz o valor de um ; símbolo, a ; temporariamente ; igual a 6 ; retorna 5, pois o ; let já foi interpretado Funções XLISPWIN
> (+ a 6) 11 > b ; Usa o valor de um símbolo como ; um argumento para a função ; Tenta pegar o valor de um símbolo sem valor Funções XLISPWIN error: unbound variable - b if continued: try evaluating symbol again • Note a mensagem de erro: algo deu errado
Símbolos especiais • O símbolo t (de true, verdadeiro) • O símbolo nil (em LISP, utilizado para representar o valor lógico falso) • Também, como visto, pode representar a lista vazia > (if t 5 6) 5
Símbolosespeciais > (if nil 5 6) 6 > (if 4 5 6) 5 • A função if é aplicada a 3 argumentos • Quando o 1o é nil, retorna o 3o • Quando o 1o é t (ou qq. outro, retorna o 3o • Retorna o argumento ou sua avaliação
Símbolosespeciais • Símbolos como t e nil são chamados de auto-avaliantes, porque eles mesmos se avaliam • Há toda uma classe de símbolos auto-avaliantes denominados keywords • Qualquer símbolo cujo nome começa com dois pontos, :, é uma keyword
Símbolosespeciais > :this-is-a-keyword :THIS-IS-A-KEYWORD > :so-is-this :SO-IS-THIS > :me-too :ME-TOO
Números (átomos numéricos) • XLISPWIN suporta 4 tipos de números • Inteiro • Real (com ponto decimal e, também, na notação científica) • Racional • Complexo