Trilhas
/
Common Lisp
Common Lisp
/
Programa
/
Múltiplos valores
Mú

Múltiplos valores em Common Lisp

3 exercícios

Sobre Múltiplos valores

Em Common Lisp, uma função não só pode retornar um valor: ela também pode retornar múltiplos valores. Por exemplo, floor, que arredonda para baixo em direção ao zero, retorna dois valores: o primeiro é o valor arredondado e o segundo é o resto.

(floor 3.5) ; => 3
            ;    0.5

(Vamos mostrar os múltiplos valores retornados em linhas separadas na saída.)

Retornar múltiplos valores

Se você quer que uma função retorne múltiplos valores, use o acessor values:

(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
                ;    2
                ;    3

Se você tem uma lista de valores que quer retornar, pode usar value-list:

(values-list '(a b c)) ; => a
                       ;    b
                       ;    c

Lidar com múltiplos valores

Se você só se importa com o primeiro valor, não precisa fazer nada de especial: a linguagem cuida disso:

(+ (values 1 2 3) (values 10 20 30)) ; => 11

No entanto, se você quiser acessar esses outros valores, há várias funções que você vai precisar usar.

As duas principais macros são multiple-value-list e multiple-value-bind. Elas servem para envolver algo que retorna múltiplos valores e capturar todos eles. A primeira cria uma lista com todos os valores. A segunda permite que você vincule variáveis aos valores individuais.

(multiple-value-list (values 1 2 3))                   ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3) 
   (+ a b c)) ; => 6

Repare que as variáveis a, b e c só existem no escopo dentro de multiple-values-bind.

Outra macro útil é nth-value. Ela é como o nth para listas: retorna o "enésimo" item de um conjunto de múltiplos valores:

(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3
Editar via GitHub O link abre em uma nova janela ou aba

Aprenda Múltiplos valores

A prática está bloqueada

Desbloqueie mais 1 exercício para praticar Múltiplos valores