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

Foi útil?

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:

14. O conses dicionário

17. As seqüências dicionário

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top