В компьютерном программировании , append
является операцией конкатенации связанных списков или массивов в некоторых языках программирования высокого уровня .
Лисп
Append
происходит из языка программирования Лисп . append
Процедура занимает ноль или более (связанные) списков в качестве аргументов и возвращает конкатенацию этих списков.
( добавить ' ( 1 2 3 ) ' ( a b ) ' () ' ( 6 )) ; Вывод: (1 2 3 ab 6)
Поскольку append
процедура должна полностью копировать все свои аргументы, кроме последнего, ее временная и пространственная сложность составляет O ( n ) для спискаэлементы. Таким образом, при необдуманном использовании в коде это может стать источником неэффективности.
nconc
Процедура (называемая append!
в схеме ) выполняет ту же функцию , как append
, но разрушительно : оно изменяет корд каждого аргумента ( за исключением последнего), указав его к следующему списку.
Выполнение
Append
может быть легко определен рекурсивно в терминах cons
. Ниже приводится простая реализация на схеме только для двух аргументов:
( Определить Append ( лямбда ( LS1 LS2 ) ( если ( нуль? LS1 ) LS2 ( против ( автомобиль LS1 ) ( Append ( корд LS1 ) LS2 )))))
Добавление также можно реализовать с помощью fold-right:
( определить append ( lambda ( a b ) ( fold-right cons b a )))
Другие языки
Вслед за Lisp, другие языки высокого уровня, которые имеют связанные списки как примитивные структуры данных , приняли расширение append
. Haskell использует ++
оператор для добавления списков. OCaml использует @
оператор для добавления списков.
В других языках символы +
или используются ++
для неразрушающего объединения строк / списков / массивов.
Пролог
В языке логического программирования Prolog есть встроенный append
предикат, который может быть реализован следующим образом:
append ([], Ys , Ys ). append ([ X | Xs ], Ys , [ X | Zs ]) : - append ( Xs , Ys , Zs ).
Этот предикат можно использовать как для добавления, так и для разделения списков. Звонок
? - добавить ( L , R , [ 1 , 2 , 3 ]).
дает решения:
L = [], R = [1, 2, 3];L = [1], R = [2, 3];L = [1, 2], R = [3];L = [1, 2, 3], R = []
Миранда
Эта правая сторона , от Hughes (1989: 5-6), имеет ту же семантику (на примере), что и реализация схемы выше, для двух аргументов.
добавить ab = уменьшить минусы ba
Где reduce - это имя Миранды для fold , а cons создает список из двух значений или списков.
Например,
append [1,2] [3,4] = уменьшить потребление [3,4] [1,2] = (уменьшить минусы [3,4]) (минусы 1 (минусы 2 ноль)) = минус 1 (минус 2 [3,4])) (заменив cons на cons и nil на [3,4]) = [1,2,3,4]
Haskell
Эта правая складка имеет тот же эффект, что и реализация схемы выше:
Append :: [ ] -> [ ] -> [ а ] Append хз YS = foldr ( : ) YS хз
По сути, это повторная реализация ++
оператора Haskell .
Perl
В Perl функция push эквивалентна методу добавления и может использоваться следующим образом.
мой @list ; нажмите @list , 1 ; нажмите @list , 2 , 3 ;
Конечным результатом является список, содержащий [1, 2, 3]
Функция unshift добавляет в начало списка, а не в конец.
мой @list ; unshift @list , 1 ; unshift @list , 2 , 3 ;
Конечным результатом является список, содержащий [2, 3, 1]
При открытии файла используйте режим «>>» для добавления, а не перезаписи.
open ( мой $ fh , '>>' , "/some/file.txt" ); print $ fh "Новый текст \ n" ; закрыть $ fh ;
Обратите внимание, что при открытии и закрытии дескрипторов файлов всегда следует проверять возвращаемое значение.
Python
В Python используйте метод списка «extend» или инфиксные операторы + и + = для добавления списков.
л = [ 1 , 2 ] л . extension ([ 3 , 4 , 5 ]) print l + [ 6 , 7 ]
После выполнения этого кода l - это список, содержащий [1, 2, 3, 4, 5], а сгенерированный вывод - это список [1, 2, 3, 4, 5, 6, 7].
Не путайте с методом списка "append", который добавляет в список единственный элемент:
л = [ 1 , 2 ] л . добавить ( 3 )
Здесь результатом является список, содержащий [1, 2, 3].
Баш
В Bash перенаправление добавления - это использование ">>" для добавления потока к чему-либо, как в следующей серии команд оболочки:
эхо Привет, мир! > текст ; эхо Прощай, мир! >> текст ; текст кошки
Стрим "Прощай, мир!" добавляется в текстовый файл, записанный в первой команде. Знак ";" подразумевает выполнение данных команд не одновременно. Итак, окончательное содержимое текстового файла:
Привет мир!
Прощай мир!
Рекомендации
- Хьюз, Джон. 1989. Почему функциональное программирование имеет значение. Компьютерный журнал 32 , 2, 98-107. https://web.archive.org/web/20070413005952/http://www.math.chalmers.se/~rjmh/Papers/whyfp.pdf
- Стил, Гай Л. мл. Общий Лисп : Язык, Второе издание . 1990. стр. 418, описание
append
.