[tspl 2.4.1] Reescreva as seguintes expressões usando let
para remover as
subexpressões em comum e melhorar a estrutura do código. Não faça nenhuma
simplificação algébrica.
(+ (- (* 3 a) b) (+ (* 3 a) b))
(cons (car (list a b c)) (cdr (list a b c)))
[tspl 2.4.3] Determine o valor da seguinte expressão. Explique como você chegou neste valor.
(let ([x 9])
(* x
(let ([x (/ x 3)])
(+ x x))))
[tspl 2.5.1] Determine o valor da seguintes expressões
(let ([f (lambda (x) x)])
(f 'a))
(let ([f (lambda x x)])
(f 'a))
(let ([f (lambda (x . y) x)])
(f 'a))
(let ([f (lambda (x . y) y)])
(f 'a))
[tspl 2.5.2] Como o procedimento primitivo list
pode ser definido?
[sicp 1.34] Dado a seguinte definição
(define (f g)
(g 2))
Então nós temos
> (f sqr)
4
> (f (lambda (z) (* z (z + 1))))
6
O que acontecerá se nós (perversamente) pedir ao interpretador para avaliar
a combinação (f f)
. Explique.
[sicp 2.4] A seguir é apresentado uma representação procedural para um par.
Para esta representação, verifique que (car (cons x y))
produz x
para
qualquer objeto x
e y
.
(define (cons x y)
(lambda (m) (m x y)))
(define (car z)
(z (lambda (p q) p)))
Qual é a definição correspondente de cdr
? (Dica: para verificar que isto
funciona, faça uso do modelo de substituição da seção 1.1.5).
Defina uma função que receba como parâmetro um predicado (função de um argumento que retorna um valor booleano) e uma lista, e conte quantos elementos da lista satisfazem o predicado. Exemplo
> (cont positive? '(1 -1 2 3 -2 5))
4
Defina uma função append
que receba como parâmetro um número variável de
listas e calcule a concatenação de todos os parâmetros. Exemplo
> (append '(1 2 3) '(4) '(5 6))
'(1 2 3 4 5 6)
A função map
pré definida no Racket aceita como parâmetro uma função de
aridade $n$ e $n$ listas do mesmo tamanho, e aplica a função a todos os
primeiros elementos das listas, depois aplica a função a todos os segundos
elementos das listas e assim por diante, retornando a lista de resultados.
Exemplo
> (map + '(1 2 3) '(4 5 6) '(7 8 9))
'(12 15 18)
Implemente esta função map
.
[sicp 2.20] Defina uma função que receba um ou mais inteiros como parâmetro e retorne uma lista com os parâmetros que tenha a mesma paridade do primeiro argumento. Exemplo
> (same-parity 1 2 3 4 5 6 7)
'(1 3 5 7)
> (same-parity 2 3 4 5 6 7)
'(2 4 6)
[sicp 2.40] Defina a função unique-pairs
que, dado um inteiro $n$ gere a
lista de pares $(i, j)$ com $1 \le j < i \le n$. Cada par é representado
por uma lista com os dois elementos do par.
[sicp 2.41] Escreva uma função que encontre todas as triplas ordenadas de inteiros positivos distintos $i, j$ e $k$ menores ou iguais a um dado inteiro $n$ cuja a soma seja igual a um dado inteiro $s$.
Defina uma função que calcule todas as permutações de um dado conjunto (representado por uma lista). Exemplo
> (permutations '(1 2 3))
'((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1))
[sicp 1.41] Defina a função double
que receba como parâmetro uma função de
um parâmetro e retorne uma função que aplique a função original duas vezes.
Por exemplo, dado que a função add1
adiciona 1 ao seu parâmetro, então
(double add1)
retorna uma função que adiciona 2 ao parâmetro. Qual é o
valor retornado por
(((double (double double)) inc) 5)
[sicp 1.42] Seja $f$ e $g$ duas funções de 1 argumento. A composição de $f$
depois de $g$ é definida como sendo a função $x \mapsto f(g(x))$. Defina
uma função compose
que implemente composição. Por exemplo
> ((compose sqr add1) 6)
49