Trilhas
/
Common Lisp
Common Lisp
/
Exercícios
/
Separando meias e sexprs
Separando meias e sexprs

Separando meias e sexprs

Exercício de aprendizagem

Introdução

Comentários

O Common Lisp permite que o programador escreva "comentários" que são ignorados pelo computador. Comentários de uma linha começam com um ou mais pontos e vírgulas (;) e, de vez em quando, você pode ver o seguinte:

(code...) ; => value

Aqui, o comentário está sendo usado para indicar qual valor o Common Lisp retorna depois de rodar o código daquela linha.

É idiomático usar um único ponto e vírgula para um comentário curto no fim de uma linha, dois para um comentário mais longo acima de um trecho de código, três para um comentário longo que descreve algo como uma função, e quatro para um comentário como um cabeçalho no topo de um arquivo-fonte.

Cons

Todos os objetos do Common Lisp são "átomos" (valores únicos e indivisíveis) ou "conses" (construídos pela função "cons"). Um cons é formado por duas partes: o primeiro elemento e o restante dos elementos. Por razões históricas, essas duas partes são chamadas de car e cdr. Quando esses conses são avaliados como código, o primeiro elemento (car) representa a função que está sendo chamada, enquanto o restante dos elementos (cdr) representa os argumentos dessa função:

(<function> <arg1> <arg2> ... <argN>)
; ^ car ^  |        ^ cdr ^

Expressões

Todo código em Common Lisp é feito de S-Expressions (Expressões Simbólicas). Para encurtar, elas são chamadas de sexprs. Toda sexpr é um átomo ou um cons. Quando as S-Expressions são avaliadas, elas retornam automaticamente algum valor, que toma o lugar da expressão. Quando você escreve suas próprias funções (usando defun), o último valor dentro do corpo do defun é retornado automaticamente:

;; Defining a new function
(defun gimme-foo () 'foo)
;; Calling the function as an S-Expression
(gimme-foo) ; => FOO

Símbolos

Os símbolos em Common Lisp são valores especiais que podem apontar para outros valores ou, no caso das palavras-chave, para si mesmos. Quando o Lisp avalia símbolos, eles são substituídos pelos valores para os quais apontam:

foo  ; => <whatever-foo-points-to>
:foo ; => :FOO

Repare que as palavras-chave são indicadas por dois-pontos (:) no início.

A citação, que é a adição de ' antes de uma S-expression, instrui o Lisp a não avaliar essa expressão. Ao citar 'foo no nosso exemplo de defun, evitamos que o Lisp tentasse procurar (e não encontrasse) aquilo para o que FOO deveria apontar, retornando em vez disso o próprio valor FOO. Se FOO não tiver sido definido em lugar nenhum do nosso programa:

foo  ; => <ERROR! Lisp doesn't know what foo points to!>
'foo ; => FOO

Por enquanto, você pode encarar isso apenas como uma forma de retornar símbolos de uma função, mas vamos voltar a falar sobre citação e explorar melhor suas implicações em exercícios de conceito futuros.

Instruções

Você! Isso mesmo, você, corajoso lisper! Lenny, o alienígena do Lisp, precisa da sua ajuda! Lenny quer sair para curtir com todos os outros alienígenas do Lisp, mas os pais avisaram que não vai a lugar nenhum enquanto o quarto não estiver limpo.

O problema é que Lenny quase não consegue ver o chão! Lenny não consegue distinguir os átomos dos conses, os símbolos das palavras-chave, os cars dos cdrs!

Você pode ajudar Lenny a organizar essa bagunça? Não se esqueça dos seus parênteses, você vai precisar deles!

1. Relembre Lenny sobre os símbolos

Antes de começar, Lenny precisa relembrar como são os símbolos e as palavras-chave: já faz um tempo desde a última arrumação... Ajude Lenny definindo duas funções: lennys-favorite-food, que é avaliada para algum símbolo, e lennys-secret-keyword, que é avaliada para alguma palavra-chave. Por exemplo:

(lennys-favorite-food) ; => LASAGNA
(lennys-secret-keyword) ; => :ALIENS-ARE-REAL

Observe que você pode retornar qualquer símbolo ou palavra-chave que quiser (se você não é fã de lasanha ou não acredita em alienígenas).

2. Ajude Lenny a distinguir entre átomos e conses

Agora que Lenny já relembrou símbolos e palavras-chave, é hora de limpar! Para organizar todas as S-Expressions espalhadas pelo quarto, Lenny precisa de ajuda para descobrir o que é um cons e o que é um átomo. Você pode ajudar implementando duas funções, is-an-atom-p e is-a-cons-p:

(is-an-atom-p 'one-thing)    ; => T
(is-an-atom-p '(two things)) ; => NIL
(is-a-cons-p 'one-thing)    ; => NIL
(is-a-cons-p '(two things)) ; => T

Nesta seção, existem várias funções internas do Lisp que podem ser úteis. Além disso, por enquanto, você pode simplesmente considerar T como verdadeiro e NIL como falso.

3. Ajude Lenny a dividir os conses

Por fim, os conses de Lenny são volumosos demais para guardar direitinho, então é preciso dividi-los em partes menores. Você pode ajudar definindo mais duas funções para separar os conses (first-thing e rest-of-it)?

(first-thing '(first second third)) ; => FIRST
(rest-of-it  '(first second third)) ; => (SECOND THIRD)

De novo, algumas funções internas do Common Lisp podem ser úteis aqui.

Editar via GitHub O link abre em uma nova janela ou aba
Common Lisp Exercism

Tudo pronto para começar Separando meias e sexprs?

Crie sua conta no Exercism para aprender e dominar Common Lisp com 27 conceitos92 exercícios e mentoria humana de verdade, tudo de graça.