Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Técnicas Alternativas de Programacão: Programacão Orientada a Objetos, Notas de estudo de Informática

Material voltado a matéria de Técnicas Alternativas de Programacão (TAP) - UFPR.

Tipologia: Notas de estudo

Antes de 2010

Compartilhado em 23/06/2009

suellen-shimabukuro-9
suellen-shimabukuro-9 🇧🇷

1 documento

1 / 32

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
===============================================
===============================================
ecnicas Alternativas de Programa¸ao:
Programa¸ao Orientada a Objetos
Prof. Alexandre Direne Dep. de Inform´atica UFPR
===============================================
===============================================
Recomenda¸ao de Software e Bibliografia:
Pacote de software para Programa¸ao Orientada a Objetos com linguagem Flavours - ambiente
Poplog - obtido no seguinte endere¸co:
http://www.cs.bham.ac.uk/research/poplog/freepoplog.html
Programa¸ao Orientada a Objetos. Isaias Camilo Boratti. Editora Visual Books.
An´alise Baseada em Objetos. Peter Coad e Edward Yourdon. Editora Campus.
Object-Oriented Languages, Systems and Applications. Gordon Balir et ali. Pitman Press.
Fundamentals of Object-Oriented Design in UML. Larry Meilir Page-Jones. Addison-Wesley Ob-
ject Technology Series.
Design Patterns: Elements of Reusable Object-Oriented Software. Erich Gamma, et ali. Addison-
Wesley Professional Computing.
Breve introdu¸ao e exemplos:
http://media.wiley.com/assets/264/19/0764557599_bonus_AppA.pdf
Boa explica¸ao e aprofundamento de princ´ıpios:
http://www.cs.vu.nl/~eliens/poosd/
http://www.cs.vu.nl/~eliens/online/oo/contents.html
Um artigo cl´assico:
http://www.inf.ufpr.br/andrey/soft/docs/beckCunningham89.pdf
1
pf3
pf4
pf5
pf8
pf9
pfa
pfd
pfe
pff
pf12
pf13
pf14
pf15
pf16
pf17
pf18
pf19
pf1a
pf1b
pf1c
pf1d
pf1e
pf1f
pf20

Pré-visualização parcial do texto

Baixe Técnicas Alternativas de Programacão: Programacão Orientada a Objetos e outras Notas de estudo em PDF para Informática, somente na Docsity!

T´ecnicas Alternativas de Programa¸c˜ao:

Programa¸c˜ao Orientada a Objetos

Prof. Alexandre Direne – Dep. de Inform´atica – UFPR

Recomenda¸c˜ao de Software e Bibliografia:

  • Pacote de software para Programa¸c˜ao Orientada a Objetos com linguagem Flavours - ambiente Poplog - obtido no seguinte endere¸co: http://www.cs.bham.ac.uk/research/poplog/freepoplog.html
  • Programa¸c˜ao Orientada a Objetos. Isaias Camilo Boratti. Editora Visual Books.
  • An´alise Baseada em Objetos. Peter Coad e Edward Yourdon. Editora Campus.
  • Object-Oriented Languages, Systems and Applications. Gordon Balir et ali. Pitman Press.
  • Fundamentals of Object-Oriented Design in UML. Larry Meilir Page-Jones. Addison-Wesley Ob- ject Technology Series.
  • Design Patterns: Elements of Reusable Object-Oriented Software. Erich Gamma, et ali. Addison- Wesley Professional Computing.
  • Breve introdu¸c˜ao e exemplos:

http://media.wiley.com/assets/264/19/0764557599_bonus_AppA.pdf

  • Boa explica¸c˜ao e aprofundamento de princ´ıpios:

http://www.cs.vu.nl/~eliens/poosd/ http://www.cs.vu.nl/~eliens/online/oo/contents.html

  • Um artigo cl´assico:

http://www.inf.ufpr.br/andrey/soft/docs/beckCunningham89.pdf

1 INTRODUC¸ ˜AO

Em linhas gerais, o paradigma de “orienta¸c˜ao a objetos” auxilia desenvolvedores a descrever disciplinada- mente a solu¸c˜ao de problemas complexos de especifica¸c˜ao e de programa¸c˜ao (e n˜ao a complexidade dos pontos de vista de dom´ınio espec´ıfico e esfor¸co computacional). De forma mais detalhada, o termo complexo se refere `a integra¸c˜ao das seguintes tarefas de programa¸c˜ao:

  • gerˆencia de tamanho (divis˜ao de trabalho em responsabilidades diferentes);
  • gerˆencia de responsabilidades (evitar a interpenetra¸c˜ao de atividades de programa¸c˜ao);
  • manuten¸c˜ao da consistˆencia (garantir veracidade das rela¸c˜oes l´ogicas entre os dados do programa, ao longo do tempo);
  • garantia de completude do conte´udo de um programa para que tal conte´udo seja, na medida do poss´ıvel, uma descri¸c˜ao autocontida tanto em “ponto grande” (especifica¸c˜ao) quanto em “ponto pequeno” (o programa em si).

1.1 PRINC´IPIOS DE PROGRAMAC¸ ˜AO

1.1.1 O DADO COMO FOCO DE MODELAGEM

A vis˜ao tradicional do paradigma de programa¸c˜ao imperativista e procedimental enfoca prioritariamente as opera¸c˜oes (ou fun¸c˜oes) e, em segundo plano, os dados que s˜ao manipulados (consultados e alterados) pelas opera¸c˜oes. Nestas condi¸c˜oes, o “ataque” indisciplinado e n˜ao padronizado aos dados pode provocar graves problemas de desenvolvimento. Na vis˜ao da programa¸c˜ao orientada a objetos, a id´eia geral ´e a de deslocar o foco prim´ario de aten¸c˜ao para o dado, de maneira que, em segundo plano, um conjunto padronizado de opera¸c˜oes possa ser definido e subordinado ao dado. Dessa forma, objetos de dados podem “se comunicar” uns com os outros por meio de canais “estreitos” e muito precisamente definidos. Diante de um princ´ıpio t˜ao b´asico, podemos dizer que tanto a programa¸c˜ao orientada por eventos quanto a programa¸c˜ao orientada por agentes s˜ao varia¸c˜oes da programa¸c˜ao orientada a objetos.

1.1.2 ABSTRAC¸ ˜AO

Para que seja poss´ıvel a descri¸c˜ao amplamente abstrata de programas, o paradigma de programa¸c˜ao orientada a objetos oferece duas disciplinas principais: (a) modulariza¸c˜ao e (b) oculta¸c˜ao parcial de informa¸c˜ao. A modulariza¸c˜ao ´e uma disciplina que se preocupa com a fragmenta¸c˜ao de um programa em partes (denominados m´odulos) com descri¸c˜ao auto-contida. Em termos computacionais, isto significa que um m´odulo pussui todas as estruturas de dados e algoritmos respons´aveis por implementar, “independente- mente”, sua parte diante do sistema completo. A oculta¸c˜ao parcial de informa¸c˜ao eleva o n´ıvel de abstra¸c˜ao um passo acima por se preocupar em esconder (parcial ou totalmente), dos usu´arios de um m´odulo, os detalhes de impelemta¸c˜ao do pr´oprio m´odulo. Com a oculta¸c˜ao (parcial ou total) da informa¸c˜ao, os usu´arios tˆem acesso a um objeto somente por meio de uma interface protegida (transl´ucida) de opera¸c˜oes de comunica¸c˜ao. Sendo assim, ao usu´ario de um m´odulo, n˜ao ´e permitido o acesso a alguns detalhes internos de implementa¸c˜ao de estruturas de dados e algoritmos.

1.1.3 POLIMORFISMO

O Polimorfismo, na verdade, pode ser enquadrado de duas grandes categorias diferentes:

  • Como um meio para a “coer¸c˜ao” de tipos/classes aos objetos, o que promove a possibilidade de um objeto (por defini¸c˜ao est´atica ou dinˆamica) pertencer a mais de uma classe durante a sua existˆencia. Nos casos especiais de linguagens que permitem a defini¸c˜ao dinˆamica da classe de um objeto, dizemos que h´a “amarra¸c˜ao tardia” (dynamic binding ou late binding) de valor;

1.2.2 ENVIO DE MENSAGENS

Objetos de dados podem “se comunicar” uns com os outros por meio de canais “estreitos” e muito precisamente definidos, conhecidos como o envio de mensagens. Esta forma de comunica¸c˜ao entre objetos permite uma s´erie de interpreta¸c˜oes dinˆamicas, as quais podem ser resumidamente apresentadas como:

  • O objeto-1 envia mensagem para o objeto-2;
  • O objeto-2 recebe e interpreta a mensagem do objeto-1;
  • O objeto-2 pode alterar seu estado interno de estruturas de dados;
  • O objeto-2 pode devolver uma mensagem para o objeto-1 e tamb´em para outros;
  • O objeto-1 recebe e interpreta a mensagem de reconhecimento do objeto-2;

1.2.3 HERANC¸ A SIMPLES E M ´ULTIPLA

A t´ecnica de programa¸c˜ao por heran¸ca de c´odigo ´e uma das mais conhecidas e contempla os conceitos de classes, subclasses, e instˆancias como objetos. Em seu est´agio mais elementar, a heran¸ca simples permite que todas as subclasses ou instˆancias de uma classe tenham acesso autom´atico a todos os dados e m´etodos da referida classe. Em uma defini¸c˜ao hier´arquica contendo um n´umero indefinido de n´ıveis de classes, subclasses e instˆancias, esta t´ecnica permite que um objeto qualquer da hierarquia tenha acesso autom´atico a todos os dados e m´etodos de todas as classes de objetos aos quais ele est´a subordinado.

1.2.4 ORGANIZAC¸ ˜AO TAXON ˆOMICA E ESPECIALIZAC¸ ˜AO

As t´ecnicas de organiza¸c˜ao taxonˆomica e especializa¸c˜ao de c´odigo s˜ao talvez as maiores motivadoras de conceitos na programa¸c˜ao orientada a objetos. A t´ecnica de organiza¸c˜ao taxonˆomica do c´odigo permite o grupamento de objetos que compartilham comportamentos semelhantes. Este grupamento ´e chamado de classifica¸c˜ao da informa¸c˜ao, o qual tamb´em admite que uma classifica¸c˜ao inclua outra. Por exemplo, uma “pilha” com comportamento “empilha” e “desempilha” pode ser inclu´ıda em uma “nova pilha” a qual tem comportamentos “empilha”, “desempilha” e “imprime”. De forma an´aloga, a especializa¸c˜ao permite a extens˜ao de comportamentos genericamente semel- hantes por meio de adapta¸c˜oes ou refinamentos sucessivos que ficam gravados explicitamente como parte integrante do c´odigo. Por exemplo, uma “fila” pode ser classificada como uma entidade que pos- sui os comportamentos “insere”, “elimina” e “imprime”. Sendo assim, todas as sub-classes derivadas de “fila” ter˜ao, consequentemente, os mesmos nomes de comportamentos (“insere”, “elimina” e “imprime”), definidos, por´em, de formas mais e mais refinadas, estendendo ou substituindo integralmente o c´odigo dos comportamentos equivalentes nas super-classes.

1.2.5 PREENCHIMENTO DE VALOR AUSENTE

Mais comumente chamado de valor “default”, o preenchimento de valor ausente ´e uma forma original- mente criada no ˆambito dos primeiros passos da programa¸c˜ao orientada a objetos. A id´eia b´asica desta t´ecnica ´e a de obten¸c˜ao dinˆamica de um valor, assumido na falta de outro mais especificamente dedicado a um objeto. Em v´arios casos, a combina¸c˜ao da t´ecnica de valor ausente com a t´ecnica de heran¸ca oferece um poderoso mecanismo de reutiliza¸c˜ao de c´odigo. Por meio de tal mecanismo, ´e poss´ıvel realizar a cria¸c˜ao de grandes quantidades de objetos contendo, na descri¸c˜ao de cada um, apenas a defini¸c˜ao expl´ıcita dos elementos de diferenciadores. A defini¸c˜ao expl´ıcita dos elementos de semelhan¸ca fica localizada na programa¸c˜ao da classe dos objetos.

2 A LINGUAGEM FLAVOURS

2.1 DEFINIC¸ ˜AO DE CLASSES

Na linguagem flavours, uma classe (ou flavour) tem a seguinte forma gen´erica:

uses flavours; flavour ; endflavour;

O corpo de uma classe ´e constitu´ıdo de vari´aveis de instˆancia e de m´etodos. As vari´aveis de instˆancia s˜ao atributos que comp˜oem o estado dos dados de um objeto. Os m´etodos s˜ao descri¸c˜oes de como receber e manipular mensagens enviadas ao objeto. A sess˜ao de vari´aveis de instˆancia ´e definida com a decclara¸c˜ao “ivars” ao passo que cada m´etodo ´e deninido com a declara¸c˜ao “defmethod”. O exemplo abaixo mostra a defini¸c˜ao de uma classe “pessoa” contendo 3 vari´aveis de instˆancia e 2 m´etodos.

uses flavours; flavour pessoa; ivars nome idade sexo; defmethod aniversario; idade + 1 -> idade; [ feliz aniversario para ^nome] => enddefmethod; defmethod identifique_se; pr(’<pessoa ’); pr(nome); pr(’>\n’); enddefmethod; endflavour;

2.2 CRIAC¸ AO DE INST ˜ ANCIASˆ

A cria¸c˜ao de instˆancias de classes ´e feita por meio da ativa¸c˜ao do procedimento “make instance”, o qual deve receber como parˆametro ´unico, uma lista contendo seqˆencias das seguintes informa¸c˜oes combinadas: <vari´avel de instˆancia> e seu . O exemplo abaixo mostra o cria¸c˜ao da instˆancia “joao”.

: vars joao; : make_instance([pessoa nome joao idade 30 sexo masculino]) -> joao;

Observa¸c˜ao: neste caso, o nome da instˆancia (“joao”) coincidiu com o valor inicial da vari´avel de instˆancia “nome”. Se a instˆancia “joao” da classe “pessoa” for empilhada e, em seguida, impressa, obteremos o seguinte:

: joao => **

2.3 ENVIO DE MENSAGENS

O envio de mensagens ´e feito da seguinte forma geral:

<- (<ARG_1>, <ARG_2>, ... <ARG_n>);

A mensagem ´e estruturada com base no conceito de sele¸c˜ao do foco de comunica¸c˜ao. O “seletor” de foco ´e sempre associado a uma veri´avel de instˆancia a ser simplesmente consultada (de forma padr˜ao) ou alterada e/ou consultada (por meio de m´etodos definidos na classe). Em v´arios casos, n˜ao h´a argumentos a serem associados ao seletor. No exemplo abaixo, v´arias mensagens s˜ao enviadas `a instˆancia “joao”, nas quais os seletores coincidem propositalmente com os nomes das vari´aveis de instˆancia “idade”, “sexo” e “nome” (consulta padr˜ao).

Agora ent˜ao podemos executar os seguintes passos:

: joao <- conjuge=> ** : vars maria; : make_instance([pessoa nome maria idade 34 sexo feminino]) -> maria; : maria <- conjuge=> ** : joao <- casa(maria); ** [Eu , joao , aceito maria como legtima esposa] ** [Eu , maria , aceito joao como legtimo esposo] : joao <- conjuge <- identifique_se; : maria <- conjuge <- identifique_se; : joao <- conjuge <- conjuge == joao => ** : joao <- casa(maria); : joao <- casa(maria); : joao <- casa(maria); : joao <- casa(maria); : vars joana; : make_instance([pessoa nome joana idade 37 sexo feminino]) -> joana; : joana <- casa(joao); ** [Eu , joana , aceito joao como legtimo esposo]

;;; MISHAP - BIGAMIA ;;; INVOLVING: ;;; DOING : pessoa<-casa pessoa<-casa pop_setpop_compiler runproc runproc

Cuidado! A repeti¸c˜ao do envio de uma mesma mensagem pode n˜ao provocar o mesmo efeito. Vocˆe pode imaginar por que? Por exemplo, no caso abaixo, pode ser que mais um m´etodo (“sus- pende casamento”) tenha que ser definido para evitar a situa¸c˜ao.

: joana <- casa(joao); :

2.5 HERANC¸ A SIMPLES

A heran¸ca na linguagem flavours ´e definida por meio da declara¸c˜ao “isa”. Ela permite que uma sub-classe ou super-classe de outra classe seja especificada, permitindo assim a visibilidade autom´atica, por parte de uma sub-classe, das vari´aveis de instˆancia e dos m´etodos definidos na classe. No exemplo abaixo, “professor” ´e definida como sub-classe de “pessoa”. Sendo assim, instˆancias da classe “professor” possuir˜ao automaticamente tamb´em as vari´aveis “nome”, “idade”, “sexo” e “con- juge”. Al´em destas, foram adicionadas 2 vari´aveis espec´ıficas (exclusivas) da classe professor: “matricula” e “area de interesse”. Sendo assim, uma instˆancia de professor, al´em de responder a todas as mensagens que uma instˆancia de pessoa ´e capaz de responder, ainda responder´a `as mensagens “leciona” e “identi- fique se”.

flavour professor isa pessoa; ivars matricula area_de_interesse; defmethod leciona(assunto); [^nome da aula de ^assunto] => enddefmethod; defmethod identifique_se;

pr(’<professor ’); pr(nome); pr(’>\n’); enddefmethod; endflavour;

Observa¸c˜ao: note que, aparentemente, uma instˆancia de professor tem agora 2 (dois) m´etodos para manipular a mensagem “identifique se”. Todavia, se a mensagem “identifique se” for enviada para uma instˆancia de professor, o m´etodo mais espec´ıfico ser´a utilizado para manipular a mensagem (aquele definido dentro da classe “professor”). Alguns exemplos de uso de heran¸ca simples s˜ao:

: vars alex; : make_instance([professor nome alex sexo masculino idade 26 area_de_interesse programacao_oo ]) -> alex; : alex => ** : alex <- identifique_se; : alex <- area_de_interesse => ** programacao_oo : alex <- aniversario; ** [feliz aniversario para alex] : alex <- idade => ** 27 : alex <- leciona("tecnicas_alternativas"); ** [alex da aula de tecnicas_alternativas]

2.6 HERANC¸ A M ´ULTIPLA

V´arios sistemas de programa¸c˜ao orientada a objetos permitem que uma classe herde veri´aveis e m´etodos de mais de uma classe. Esta t´ecnica ´e chamada de heran¸ca m´ultipla e tamb´em ´e especificada com a declara¸c˜ao “isa”. No exemplo abaixo, uma nova classe, a de “professor ingles”, ´e definida como sub-classe de “profes- sor”, a qual, por sua vez, ´e tamb´em uma sub-classe de “pessoa”.

flavour professor_ingles isa professor; ... ... endflavour;

Uma forma alternativa de definir “professor ingles” por meio de heran¸ca m´ultipla seria por meio da cria¸c˜ao de uma classe “pessoa inglesa” e, em seguida, definindo “professor ingles” como sub-classe tanto de “pessoa inglesa” quanto de “professor”. Isto poderia ser atingido da seguinte forma:

flavour professor_ingles isa pessoa_inglesa professor; ... ... endflavour;

3 LINGUAGEM DE PROGRAMAC¸ ˜AO DE M´ETODOS

3.1 PRINCIPAIS TIPOS B ´ASICOS DA LINGUAGEM

3.1.1 N ´UMEROS (numbers):

  • Inteiros: 66 99876789 -
  • Decimais: 88.532 1.2345e3 (=1234.5) 123.4e-3 (=0.1234)

{3 gato ’curso de Pop-11’ 99 }

Para se ter acesso a um determinado de um vetor tanto para consulta quanto para altera¸c˜ao, um ´ındice num´erico deve ser utilizado, de acordo com os exemplos abaixo:

: {um gato} -> vetor; : vetor(2) => ** gato : subscrv(2,vetor) => ** gato : "rato" -> subscrv(1, vetor); : vetor => ** {rato gato}

Vetores, assim como words, striings e outros objetos, podem ser concatenados da seguinte forma:

: {o curso} <> {de pop esta emocionante} => ** {o curso de pop esta emocionante}

REFERˆENCIAS: help vectors, help consvector, help subscrv, help vectorclass

3.1.5 VETORES MULTIDIMENSIONAIS OU MATRIZES (arrays): Um array ´e uma estrutura multidimensional composta de:

  • Um vetor contendo os dados;
  • Uma lista de limites inferior e superior para indexar cada dimensao;
  • Um procedimento de acesso tanto para consulta como para altera¸c˜ao, orientados por ´ındices num´ericos.

Para se criar um array, deve ser utilizado o procedimento “newarray” da seguinte forma:

newarray(<LISTA-DE-LIMITES>, <VALOR-INICIAL>) -> <NOME-MATRIZ> ;

Por exemplo:

: newarray([1 10 1 10], 0) -> matriz; : matriz => ** <array [1 10 1 10]>

Em modo de consulta, temos por exemplo:

: matriz(3,9) => ** 0

Em modo de altera¸c˜ao, temos por exemplo:

: 1 -> matriz(3,9);

Se o acesso tentar utilizar um ´ındice inv´alido, teremos:

: matriz(3,29) => ;;; MISHAP - INVALID ARRAY SUBSCRIPT ;;; INVOLVING: 29 ;;; DOING : compile nextitem popval compile

Caso seja necess´ario criar um array com valores iniciais diferentes para cada elemento, a seguinte forma do “newarray” pode ser usada:

newarray(<LISTA-DE-LIMITES>, ) -> <NOME-MATRIZ> ;

Neste caso, < LIST A − DE − LIM IT ES > tem 2N elementos e < P ROCEDIM EN T O >, quando ´e ativado, recebe N inteiros como parametros, os quais s˜ao resultantes de cada elemento do produto cartesiano dos ´ındices. A quantidade de vezes que < P ROCEDIM EN T O > ´e ativado ´e igual ao n´umero total de elementos do array. Para cada ativa¸c˜ao, o valor inicial do referido elemento ´e calculado com base nos valores dos ´ındices do elemento. Sendo assim, o valor de < N OM E − M AT RIZ > (i 1 , i 2 , ..., iN ) ser´a calculado por uma ativa¸c˜ao autom´atica da forma: < P ROCEDIM EN T O > (i 1 , i 2 , ..., iN ) onde i1 e’ um valor dentro dos limites num´ericos da dimens˜ao 1, valendo o mesmo para i 2 , ..., iN. REFERˆENCIAS: teach arrays, help newarray

3.1.6 LISTAS DIN ˆAMICAS (lists):

Listas dinamicas s˜ao estruturas muito flex´ıveis e que contam com um grande n´umero de procedimentos de manipula¸c˜ao, constituindo uma poderosa biblioteca para a implementa¸c˜ao de algoritmos diversos. O exemplo abaixo mostra como criar uma lista de 4 elementos:

[ 333 ’curso maravilhoso’ [a b c ] 99 ]

Listas podem ser facilmente manipuladas, por exemplo, para a invers˜ao de seus elementos:

: rev([1 2 3 4]) => ** [4 3 2 1]

O ´ultimo elemento de uma lista ´e obtido com o procedimento “last”:

: last([gato cachorro cobra]) => ** cobra : last([ [marcus vinicius] [luiz alberto] [ana maria] ]) => ** [ana maria]

Ou o primeiro elemento:

: hd([1 2 3 4]) => ** 1 : hd(rev([gato cachorro cobra])) => ** cobra : hd(last([ [marcus vinicius] [luiz alberto] [ana maria] ])) => ** ana

Por´em, se uma lista vazia for processada, o seguinte ocorre:

: hd([]) =>

;;; MISHAP - NON-EMPTY LIST NEEDED ;;; INVOLVING: [] ;;; DOING : hd pop_setpop_compiler runproc runproc

O procedimento “tl” recebe uma lista e produz uma nova lista contendo todos os elementos da lista de entrada, com excess˜ao do primeiro.

: delete(3, [3 3 3], 1) => ** [3 3] : delete(3, [3 3 3], 2) => ** [3]

Considere o seguinte comportamento:

: vars l, l1; : [ a b c ] -> l; : l -> l1; : 93 -> l1(2); : l1 => ** [a 93 c] : l => ** [a 93 c]

Listas s˜ao compostas de pares. Um par ´e uma estrutura com os componentes e , conforme a ilustra¸c˜ao abaixo:


| FRONT | BACK |

Uma lista de 3 elementos ´e constituida de 3 pares encadeados:

_____ variavel l | _____ variavel l v | ____v___________ ________________ ________________ | a | ----------> | 93 | ---------->| c | ------>/


Logo, ambas as vari´aveis “l” e “l1” apontam para o mesmo local de mem´oria. Cuidado!!! A concatena¸c˜ao de listas pode produzir efeitos indesej´aveis. Por exemplo:

: [ a b c ] -> l1; : [ d e f ] -> l2; : l1 <> l2 -> l3;

A´em das opera¸c˜oes acima, ainda temos:

: 3 :: [4 5 6] => ** [3 4 5 6] : "CAT" :: [] => ** [CAT] : "CAT" :: "DOG" =>

;;; MISHAP - LIST NEEDED ;;; INVOLVING: DOG ;;; DOING : :: pop_setpop_compiler runproc runproc

Quando da intercala¸c˜ao ou composi¸c˜ao de listas, cuidados devem ser tomados com a diferen¸ca entre inser¸c˜ao e c´opia dos elementos um a um. Veja o exemplo abaixo:

vars lista; [ b c d ] -> lista; [a ^lista e ] => ** [a [b c d] e] [a ^^lista e ] => ** [a b c d e]

Al´em disso, os seguintes comandos s˜ao equivalentes:

: [^x] <> l -> l; : x :: l -> l; : [^x ^^l] -> l;

. Tamb´em s˜ao equivalentes os seguintes comandos:

: [ ^X + ^Y is ^(X + Y) ] -> l; : [% X, "+", Y, "is", X + Y %] ->l; : [ %X% + %Y% is %X + Y% ] -> l;

Finalmente, ´e importante entender alguns detalhes das express˜oes abaixo:

[ % 3, aaa, hd(l) % ] [ 3, aaa, hd(l) ] [ % aaa, hd(l)% ] [% [% a %], [% b, c%], [% d %] %]

REFERˆENCIAS: teach lists, teach listsummary, help morelists help destlist, dest, dl, explode, applist, maplist, sort, ::, <>

3.1.7 REGISTROS (defclass):

Classes de registros s˜ao definidas para que seja poss´ıvel alocar estruturas heterogˆeneas na mem´oria de forma orientada por atributos mnemˆonicos. Listas e vetores tamb´em admitem valora¸c˜ao heterogˆenea por´em, o acesso indexado ´e puramente num´erico. No exemplo abaixo, a classe de registros “reg aluno” ´e definida com atributos “matric aluno”, “nome aluno”, “ira aluno”. Em seguida, o objeto registro “alexd” ´e definido.

: defclass reg_aluno {matric_aluno, nome_aluno, ira_aluno}; : consreg_aluno(981334, ’Alexandre Direne’, 7.46) -> alexd;

3.2 PRINCIPAIS COMANDOS B ASICOS DA LINGUAGEM´

3.2.1 ATRIBUIC¸ ˜AO DESTRUTIVA E N ˜AO DESTRUTIVA

A atribui¸c˜ao, expressa por “− >” e uma opera¸c˜ao que remove um item da pilha do programador, e o coloca em outra posi¸c˜ao de mem´oria. Por exemplo, coloca-se quatro itens na pilha da seguinte forma:

: 9, ’gato’, 99, "azul";

A seta de atribui¸c˜ao pode ser usada para remover o topo da pilha e armazena-lo como o valor da vari´avel “x” da seguinte forma:

: -> x;

Logo, 3 itens ainda permanecem na pilha.

: stacklength() ==> ** 3

Agora, se exibirmos o que restou na pilha teremos:

: => ** 9 gato 99

Ou ainda, a forma geral da decis˜ao por nega¸c˜ao ´e:

unless then <COMANDO 1> ;

... ; endunless;

Esta ´e equivalente a:

if not() then ... endif

Seja o exemplo abaixo:

if x > y then x => else y => endif;

Compare com:

if x > y then x => elseif y > x then y => else "iguais" => endif;

Considere agora o exemplo abaixo:

if 2 < x and x < 6 then true ; else false ; endif =>

Note que o exemplo acima ´e equivalente a:

2 < x and x < 6 =>

REFERˆENCIAS: help if, help switchon

3.2.3 REPETIC¸ ˜AO COM FORMAS VARIADAS

Forma geral:

until do enduntil;

Exemplo:

3 -> num; until num > 99 do num => num + 1 -> num; enduntil;

Forma geral:

repeat times endrepeat;

Exemplo:

repeat 10 times pr(newline) endrepeat;

Forma geral:

repeat endrepeat;

Observa¸c˜ao: repeti¸c˜ao infinita (a para deve utilizar quitif). Forma geral:

while do endwhile

Exemplo:

1 -> num; while num * num < 1000 do num + 1 -> num endwhile;

Forma geral:

for step till do endfor;

Exemplo:

for 1->x step x+2 -> x till x > 42 do spr(x); endfor;

: 1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41

Forma geral:

for in do endfor;

Exemplo:

[1 2 3 4 5] -> numbers; for num in numbers do pr(’\n O quadrado de: ’); pr(num); pr(’ e: ’); pr(num*num); endfor;

: O quadrado de: 1 e: 1 O quadrado de: 2 e: 4 O quadrado de: 3 e: 9 O quadrado de: 4 e: 16 O quadrado de: 5 e: 25

Forma geral:

for on do endfor;

Quando o erro ´e semˆantico, este receber´a tratamento semelhante ao sint´atico mas com a exibi¸c˜ao da mensagem somente em tempo de execu¸c˜ao do comando (e n˜ao de compila¸c˜ao). Por exemplo, considere a compila¸c˜ao correta do procedimento abaixo:

define teste; "um" + "dois" => enddefine;

A ati¸c˜ao do mesmo prodizir´a:

: teste(); ;;; MISHAP - NUMBER(S) NEEDED ;;; INVOLVING: um dois ;;; DOING : + teste pop_setpop_compiler runproc runproc

REFERˆENCIAS: help mishap

3.4 MODULARIZAC¸ ˜AO DE M´ETODOS E VISIBILIDADE DE NOMES

3.4.1 DECLARAC¸ ˜AO E ESCOPO DE VARI ´AVEIS E CONSTANTES

Vari´aveis e constantes s˜ao identificadores os quais podem assumir escopo DIN AMICO ou Lˆ EXICO.´ Todo identificador em Pop-11 ´e local ao seu escopo, a n˜ao ser que este seja explicitamente declarado como GLOBAL. Observa¸c˜oes Importantes:

  • os identificadores de escopo dinˆamico s˜ao permanentes durante toda a execu¸c˜ao do programa e podem ser consultados ou alterados em qualquer local deste programa (a n˜ao ser que tenham sido destruidos explicitamente);
  • os de escopo l´exico s˜ao tempor´arios, s´o podendo ser consultados ou alterados dentro da unidade de programa (ex. um procedimento) onde foram declarados.

Forma geral para declara¸c˜ao:

vars lvars constant lconstant

REFERˆENCIAS: help vars, help constant, help global Exemplos:

define teste11; vars a11; 1 -> a11; enddefine;

define teste12; lvars a12; 2 -> a12; enddefine;

: isdeclared("a11") => ** <ident >

: isdeclared("a12") => ** : a11 => ** : a12 => ;;; DECLARING VARIABLE a **

Observa¸c˜oes adicionais:

  • ´e importante notar que todas as vari´aveis, tanto as passadas como parˆametros com as produzidas como resultado, declaradas dentro do procedimento utilizando VARS e LVARS, ser˜ao locais ao procedimento. Portanto, em um procedimento recursivo, para cada ativa¸c˜ao do mesmo, teremos posi¸c˜oes de mem´oria distintas que “nao interferem” uma na outra;
  • Existem ainda vari´aveis chamadas ativas que s˜ao na verdade “fun¸c˜oes automaticamente executadas toda vez que o valor da vari´avel for consultado ou alterado.

3.4.2 DEFINIC¸ ˜AO DE PROCEDIMENTOS E FUNC¸ ˜OES

A declara¸c˜ao de procedimentos e fun¸c˜oes como unidades de um programa ´e feita da seguinte forma:

define ; enddefine;

Quando for o caso, o “ATUALIZADOR” do procedimento ou fun¸c˜ao tamb´em pode ser declarado de forma semelhante:

define updaterof ; enddefine;

De forma mais espec´ıfica, o procedimento abaixo define um identificador “proc” de 3 argumentos e 2 resultados. O nome “proc” ´e global e o corpo do procedimento e’ associado a “proc” como sendo seu valor.

define proc(a,b,c) ->d ->e; < ... > < ... > enddfine;

Adicionalmente, cinco vari´aveis LOCAIS, 3 de entrada e 2 de sa´ıda, s˜ao declaradas implicitamente e ser˜ao, por default, de carater PERMANENTE (n˜ao s˜ao de escopo l´exico). Caso seja requisito de programa¸c˜ao que as vari´aveis (algumas ou todas) sejam de carater TEMPOR ARIO, a declara¸´ c˜ao expl´ıcita das mesmas se faz necess´ario. A forma gen´erica para isso ´e a seguinte:

define proc(a,b,c) ->d ->e; lvars a,b,c,d,e; enddefine;

Em seguida est˜ao alguns exemplos b´asicos de modulariza¸c˜ao de comandos explicitando as quest˜oes de VISIBILIDADE (escopo) e VALIDADE (tempo) de vari´aveis.