0%
Pular para o conteúdo principal
0%

2.5.1 Operações Aritméticas Genéricas

A tarefa de projetar operações aritméticas genéricas é análoga à tarefa de projetar as operações genéricas de seletor de números complexos. Gostaríamos, por exemplo, de ter uma função genérica de adição add que atue como aritmética ordinária + em números ordinários, como add_rat em números racionais e como add_complex em números complexos.

Interface Genérica

Podemos implementar as operações aritméticas genéricas usando a estratégia de programação orientada a dados:

Carregando playground de código...

Instalando Pacotes Aritméticos

Agora podemos instalar cada pacote aritmético:

Pacote de Números JavaScript

Carregando playground de código...

Pacote de Números Racionais

Carregando playground de código...

Pacote de Números Complexos

Carregando playground de código...

Sistema de Tipos em Duas Níveis

Observe que um número complexo em forma retangular recebe etiquetas aninhadas: a etiqueta externa "complex" direciona para o pacote complexo, enquanto a etiqueta interna "rectangular" direciona dentro daquele pacote. À medida que as operações executam para baixo através das camadas de abstração, as etiquetas externas são removidas, revelando as etiquetas internas para o dispatch continuado.

Exercícios

Exercício 2.77: Trace através das chamadas de função que ocorrem ao avaliar a expressão magnitude(z) onde z é um número complexo etiquetado.

Exercício 2.78: A representação de números JavaScript internos com etiquetas é ineficiente. Modifique o sistema para tirar vantagem do sistema de tipos do próprio JavaScript.

Exercício 2.79: Defina um predicado genérico de igualdade is_equal que funciona para números ordinários, racionais e complexos.

Exercício 2.80: Defina um predicado genérico is_equal_to_zero que testa se seu argumento é zero.

📝 Encontrou algo errado nesta página?

Sua ajuda é muito importante para melhorar a qualidade da tradução!

🐛 Encontrou um erro?

Se você encontrou:

  • Erro de tradução (palavra incorreta, termo técnico errado)
  • Erro de ortografia ou gramática
  • Link quebrado
  • Código de exemplo que não funciona
  • Problema de formatação

Reporte um bug →

❓ Tem uma dúvida?

Se você tem:

  • Dúvida sobre o conteúdo desta seção
  • Pergunta sobre um conceito do SICP
  • Dificuldade em entender algum exemplo
  • Questão sobre a tradução de algum termo

Inicie uma discussão →

💡 Tem uma sugestão de melhoria?

Se você quer sugerir:

  • Melhoria na explicação
  • Exemplo adicional
  • Recurso visual (diagrama, ilustração)
  • Qualquer outra ideia

Sugira uma melhoria →

🌍 Quer discutir a tradução?

Se você quer debater:

  • Escolha de tradução de algum termo
  • Consistência de terminologia
  • Nuances do português

Discussão de tradução →

Obrigado por ajudar a melhorar o SICP.js PT-BR! ✨