Common Lisp: Trabalhando com & parâmetros de descanso
-
08-07-2019 - |
Pergunta
Alguém pode me dizer como trabalhar com os parâmetros armazenados no valor especificado por & descansar.
Eu li em torno de um monte e parece como se os autores só sabem listar todos os parâmetros como tal.
(defun test (a &rest b) b)
Isso é bom de ver, mas não é realmente útil.
O melhor que eu encontrei até agora é usar primeiro, segundo, e assim por diante para obter o parâmetro que você está procurando.
(defun test (a &rest b)
(first b))
Eu observei este método pára de funcionar na décima parâmetro, mas a especificação (do que tenho lido) suporta um mínimo de 50. Mesmo que as chances são pequenas que eu vou usar 50 parâmetros, eu gostaria de sabe como acessá-los todos.
Graças
Solução
O primeiro, segundo e assim por diante acessores funções são "apenas" funções de utilidade no topo do CAR / CDR ou NTH. Então, eu acho, a resposta à sua pergunta específica é "uso NTH ou ELT" (ou construir seu próprio específico acccessor funções).
Se você quiser, você pode definir um décimo primeiro como:
(Defun XI (lista) (10 lista enésimo))
Eu acho, porém, que eu principalmente usar e argumentos descansar quando há a 0 ou mais coisas que eu quero fazer algo com, realmente não se importar com a posição específica de um determinado argumento no & lista REST. Isso geralmente envolve usando LOOP, DO ou DOLIST para atravessar os argumentos e fazer alguma coisa com cada um; a família MAP ou (ocasionalmente) REDUZIR.
Outras dicas
parâmetro Resto é apenas uma lista. Você pode lidar com isso usando operações de lista normais.
(defun test (a &rest b))
(dolist (s b)
(when (> s 1)
(print s)
(do-something-else b)))
Na verdade, a função é útil. Você só tem que tentar.
CL-USER 1 > (defun test (a &rest b) b)
TEST
CL-USER 2 > (test 1 2 3 4)
(2 3 4)
Então você vê que B é apenas uma lista de argumentos. Assim, cada operação de lista ea sequência se aplica. Não há nada de mágico. Há funções para acessar o elemento NTH, funções para remover elementos, etc ..
No Lisp HyperSpec comum as funções relevantes são listados:
Para um Lisp básica tutorial confira o livro por Touretzky:
Common Lisp: A Gentle Introdução à Computação Simbólica
O livro está disponível para download em PDF e Postscript. Ela ensina Lisp comum básico.
Você também pode usar desestruturação-bind:
(defun my-function (&rest arguments)
(destructuring-bind (a b &rest c) arguments
(format nil "~A,~A followed with ~A" a b c)))
CL-USER> (my-function 1 2 "Give" 'me "more" 'arguments!!)
==> "1,2 followed with (Give ME more ARGUMENTS!!)"
Eu só tenho uma iteração recursiva para passar por todos eles, eu acho dolist é melhor, mas eu gosto de usar a velha maneira