Pular para o conteúdo principal

2.3.1 Strings como Objetos de Dados

Em JavaScript, strings (delimitadas por aspas duplas " ou aspas simples ') permitem que programadores tratem texto como dados literais ao invés de código a ser avaliado. Por exemplo, "z" denota uma string de caractere, enquanto z sem aspas refere-se ao valor de uma variável.

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

Podemos formar listas compostas de strings e números:

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

A Função member

Para implementar a manipulação de dados simbólicos, precisamos de uma função member que verifica se um item está presente em uma lista:

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco

A função member retorna a sublista começando com a primeira ocorrência do item, ou null se o item não está na lista.

Exercício 2.53

O que seria impresso pelo interpretador em resposta à avaliação de cada uma das seguintes expressões?

Exemplo de Código
⛓ sessão — este bloco compartilha o ambiente da página: as declarações dos blocos anteriores são avaliadas antes deleCódigo editável · Ctrl+Enter executa · Esc solta o foco
💡 Mostrar solução — tente primeiro!💡 Esconder solução

Na notação de caixas desta edição (execute o bloco acima e confira):

ExpressãoValor
list("a", "b", "c")["a", ["b", ["c", null]]]
list(list("george"))[["george", null], null]
tail(list(list("x1","x2"), list("y1","y2")))[["y1", ["y2", null]], null]
tail(head(list(list("x1","x2"), list("y1","y2"))))["x2", null]
member("red", list(list("red","shoes"), list("blue","socks")))null
member("red", list("red","shoes","blue","socks"))["red", ["shoes", ["blue", ["socks", null]]]]

O quinto caso pega muita gente: as cabeças daquela lista são listas (list("red","shoes") etc.), nunca a string "red" — o member compara com === e não entra dentro delas.

Exercício 2.54

Duas listas são consideradas equal se contêm elementos iguais organizados na mesma ordem. Implemente equal como uma função.

💡 Mostrar solução — tente primeiro!💡 Esconder solução

Ideia. Igualdade estrutural: ou os dois são pares com cabeças iguais e caudas iguais, ou são primitivos idênticos.

Exemplo de Código
Código editável · Ctrl+Enter executa · Esc solta o foco

O caso base cobre strings, números e o null do fim das listas de uma vez — === faz o trabalho quando não há mais estrutura para descer.

Exercício 2.55

Explique o que acontece quando você avalia uma string com a função display e por que isso difere da avaliação normal.

💡 Mostrar solução — tente primeiro!💡 Esconder solução

Avaliar uma string sozinha — "abracadabra"; — faz o interpretador ecoar o valor na sua representação de programa: entre aspas, "abracadabra". Já display("abracadabra") imprime o conteúdo da string, sem aspas, e devolve a string (que o REPL então ecoa com aspas).

A diferença é entre o valor e a notação que o denota: o eco do interpretador responde "que expressão produziria este valor" (por isso as aspas, como stringify faz); display responde "que texto este valor contém". Para números a distinção é invisível — para strings, as aspas são exatamente a fronteira entre dados e código.

📝 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! ✨