Anexo - Append

Na programação de computadores , appendé a operação para concatenar listas ou matrizes vinculadas em algumas linguagens de programação de alto nível .

Lisp

Appendtem origem na linguagem de programação Lisp . O appendprocedimento leva zero ou mais listas (vinculadas) como argumentos e retorna a concatenação dessas listas.

(append '(1 2 3) '(a b) '() '(6))
;Output: (1 2 3 a b 6)

Uma vez que o appendprocedimento deve copiar completamente todos os seus argumentos, exceto o último, sua complexidade de tempo e espaço são O ( n ) para uma lista de elementos. Portanto, pode ser uma fonte de ineficiência se usado de forma imprudente no código.

O nconcprocedimento (chamado append!em Scheme ) desempenha a mesma função append, mas de forma destrutiva : altera o cdr de cada argumento (salva o último), apontando-o para a próxima lista.

Implementação

Appendpode ser facilmente definido recursivamente em termos de cons. O que se segue é uma implementação simples no Scheme, apenas para dois argumentos:

(define append
  (lambda (ls1 ls2)
    (if (null? ls1)
      ls2
      (cons (car ls1) (append (cdr ls1) ls2)))))

Append também pode ser implementado usando fold-right:

(define append
   (lambda (a b)
      (fold-right cons b a)))

Outras línguas

Seguindo o Lisp, outras linguagens de alto nível que apresentam listas vinculadas como estruturas de dados primitivas adotaram um append. Haskell usa o ++operador para anexar listas. OCaml usa o @operador para anexar listas.

Outras linguagens usam os símbolos +ou ++para concatenação de string / lista / array não destrutiva .

Prolog

A linguagem de programação lógica Prolog apresenta um appendpredicado integrado , que pode ser implementado da seguinte forma:

append([],Ys,Ys).
append([X|Xs],Ys,[X|Zs]) :-
    append(Xs,Ys,Zs).

Este predicado pode ser usado para anexar, mas também para separar listas. Chamando

 ?- append(L,R,[1,2,3]).

produz as soluções:

L = [], R = [1, 2, 3] ;
L = [1], R = [2, 3] ;
L = [1, 2], R = [3] ;
L = [1, 2, 3], R = []

Miranda

Esta dobra direita , de Hughes (1989: 5-6), tem a mesma semântica (por exemplo) que a implementação de Scheme acima, para dois argumentos.

append a b = reduce cons b a

Onde reduzir é o nome de Miranda para dobra e contras constrói uma lista a partir de dois valores ou listas.

Por exemplo,

append [1,2] [3,4] = reduce cons [3,4] [1,2]
    = (reduce cons [3,4]) (cons 1 (cons 2 nil))
    = cons 1 (cons 2 [3,4]))
        (replacing cons by cons and nil by [3,4])
    = [1,2,3,4]

Haskell

Esta dobra à direita tem o mesmo efeito que a implementação do Esquema acima:

append :: [a] -> [a] -> [a]
append xs ys = foldr (:) ys xs

Esta é essencialmente uma reimplementação do ++operador de Haskell .

Perl

Em Perl , a função push é equivalente ao método append e pode ser usada da seguinte maneira.

my @list;
push @list, 1;
push @list, 2, 3;

O resultado final é uma lista contendo [1, 2, 3]

A função unshift anexa ao início de uma lista, ao invés do final

my @list;
unshift @list, 1;
unshift @list, 2, 3;

O resultado final é uma lista contendo [2, 3, 1]

Ao abrir um arquivo, use o modo ">>" para anexar em vez de sobrescrever.

open(my $fh, '>>', "/some/file.txt");
print $fh "Some new text\n";
close $fh;

Observe que ao abrir e fechar identificadores de arquivo, deve-se sempre verificar o valor de retorno.

Pitão

Em Python , use o método de lista "extend" ou os operadores infixo + e + = para anexar listas.

l = [1, 2]
l.extend([3, 4, 5])
print l + [6, 7]

Depois de executar este código, l é uma lista contendo [1, 2, 3, 4, 5], enquanto a saída gerada é a lista [1, 2, 3, 4, 5, 6, 7].

Não confunda com o método de lista "append", que adiciona um único elemento a uma lista:

l = [1, 2]
l.append(3)

Aqui, o resultado é uma lista contendo [1, 2, 3].

Bash

No Bash, o redirecionamento de acréscimo é o uso de ">>" para adicionar um fluxo a algo, como na seguinte série de comandos de shell:

echo Hello world! >text; echo Goodbye world! >>text; cat text

O fluxo "Adeus mundo!" é adicionado ao arquivo de texto escrito no primeiro comando. O ";" implica a execução dos comandos dados em ordem não simultaneamente. Portanto, o conteúdo final do arquivo de texto é:

Olá Mundo!
Adeus mundo!

Referências