Projeto da disciplina de Paradigmas de Linguagem(IN-1007) de Programação do CIn - UFPE
- João Pedro Monteiro Pereira jpmp2@cin.ufpe.br
- André Souza alssg@cin.ufpe.br
Implementar um novo tipo de valor ValorMapa que permita armazenar e manipular pares chave-valor de forma funcional, mantendo a imutabilidade e transparência referencial da linguagem.
// Adição ao ValorConcreto existente
ValorConcreto ::= ValorInteiro
// Novas expressões para manipulação de mapas
// Compreensão de mapas
ExpCompreensaoMapa ::= "{" Expressao "=>" Expressao Gerador+ [Filtro] "}"
Gerador ::= "for" Id "in" Expressao | "for" Id "in" Expressao [","] Gerador
// Definições das demais expressões
ExpMapa ::= "{" Expressao "=>" Expressao "}"
ExpInsert ::= "insert" "(" Expressao "," Expressao "," Expressao ")"
ExpRemove ::= "remove" "(" Expressao "," Expressao ")"
ExpGet ::= "get" "(" Expressao "," Expressao ")"
ExpContains ::= "contains" "(" Expressao "," Expressao ")"
ExpKeys ::= "keys" "(" Expressao ")"
ExpValues ::= "values" "(" Expressao ")"
// Uso das expressões
| ExpGet
| ExpKeys
let var mapa = { 1 => 2, 3 => 4 } in ...
let var novoMapa = insert(mapa, 4, 5) in ...
let var semB = remove(mapa, 1) in ...
let var valor = get(mapa, 3) in ...
let var existe = contains(mapa, 3) in ...
let var chaves = keys(mapa) in ...
let var valores = values(mapa) in ...
// Criação e manipulação de mapa
let var mapa = { 1 => 2, 3 => 4 } in
let var comTres = insert(mapa, 4, 5) in
let var semDois = remove(comTres, 1) in
let var temUm = contains(semDois, 3) in
let var valor = get(semDois, 4) in
let var todasChaves = keys(semDois) in
valor
// Exemplo com mapas aninhados
let var configuracoes = {
"cores" => {
"primaria" => "azul",
"secundaria" => "vermelho"
},
"tamanhos" => {
"pequeno" => "10px",
"grande" => "20px"
}
} in
get(get(configuracoes, "cores"), "primaria")
// Sem filtro
let var quadrados = { x => x * x for x in [1,2,3] } in
// Resultado: {1 => 1, 2 => 4, 3 => 9}
// Com filtro
let var pares = { x => x * 2 for x in [1,2,3,4,5] if x > 2 } in
// Resultado: {3 => 6, 4 => 8, 5 => 10}
// Criando mapa com compreensão e filtro
let var dados = [1, 2, 3, 4, 5] in
let var mapa = {
x => x * x
for x in dados
if x > 2
} in
| Id
| ExpMapa
Valor ::= ValorConcreto
ValorConcreto ::= ValorInteiro
ValorFuncao ::= "fn" Id Id "." Expressao
ExpUnaria ::= ExpMenos "-" Expressao
| ExpLength "length" Expressao
ExpCompreensaoLista ::= Expressao Gerador
ExpCompreensaoMapa ::= "{" Expressao "=>" Expressao Gerador+ [Filtro] "}"
Gerador ::= "for" Id "in" Expressao | "for" Id "in" Expressao [","] Gerador
ExpBinaria ::= Expressao "+" Expressao
// Definições das expressões
ExpMapa ::= "{" Expressao "=>" Expressao "}"
ExpInsert ::= "insert" "(" Expressao "," Expressao "," Expressao ")"
ExpRemove ::= "remove" "(" Expressao "," Expressao ")"
ExpGet ::= "get" "(" Expressao "," Expressao ")"
ExpContains ::= "contains" "(" Expressao "," Expressao ")"
ExpKeys ::= "keys" "(" Expressao ")"
ExpValues ::= "values" "(" Expressao ")"
ExpCompreensaoMapa ::= "{" Expressao "=>" Expressao Gerador+ [Filtro] "}"
// Uso das expressões
| ExpGet
| ExpKeys
ExpDeclaracao ::= "let" DeclaracaoFuncional "in" Expressao
DeclaracaoFuncional ::= DecVariavel
DecVariavel ::= "var" Id "=" Expressao
DecFuncao ::= "fun" ListId "=" Expressao
DecComposta ::= DeclaracaoFuncional "," DeclaracaoFuncional
Aplicacao ::= Expressao "(" ListExp ")"
ListExp ::= Expressao | Expressao "," ListExp
ValorMapa
ExpCompreensaoMapa
ExpInsert
ExpRemove
ExpGet
ExpContains
ExpKeys
ExpValues