Как удалить первый элемент из списка? - PullRequest
3 голосов
/ 20 марта 2010

Как удалить первый элемент из списка в схеме?

Предположим, у меня есть следующий список

'((apple bob car) (cat dig) (e)))

Как бы мне просто избавиться от apple и оставить остальных в покое?

Ответы [ 4 ]

9 голосов
/ 20 марта 2010

Три основные операции со списком в схеме:

  • cdr, что означает «отдых» или «дай мне список, без первого пункта»
  • car, что означает «первый» или «дать мне первый элемент в списке»
  • cons, что означает добавление списков

при условии, что s - это список ((автомобиль Apple Bob) (Cat Dig) (E))

Промежуточные шаги

(car s)       ; (apple bob car)
(cdr (car s)) ; (bob car)
(cdr s)       ; ((cat dig) (e))

Конечное выражение

(cons (cdr (car s))) (cdr s))

Результат

((bob car) (cat dig) (e))
5 голосов
/ 20 марта 2010

Во-первых, признайте, что ваш вопрос немного противоречив. Если вы хотите удалить первый элемент в списке, у вас останется

((cat dig) (e))

потому что первый элемент в списке - (apple bob car).

Если вы пытаетесь избавиться только от apple, то если глава (машина) списка - это сам список, вы хотите заменить его на его cdr. Я предполагаю, что вы хотите, чтобы это работало независимо от глубины списка, поэтому вам понадобится рекурсивный метод (в отличие от других ответов).

Таким образом, если первый элемент является списком, то вам необходимо удалить первый элемент из списка и рекурсивно добавить его в остальную часть списка. Это похоже на работу:

(define removeFirst
  (lambda (input)
    (cond
      ((list? (car input)) (cons (removeFirst (car input)) (cdr input)))
      (else (cdr input))
    )
  )
)

> (removeFirst '((apple bob car) (cat dig) (e)))
((bob car) (cat dig) (e))
1 голос
/ 20 марта 2010

В дополнение к другим ответам, есть вид мутации в вашем вопросе, и списки в Схеме, как правило, неизменны - даже списки в списках. Вот почему все остальные ответы вернули новый список без элемента, от которого вы хотели избавиться. Вы можете назначить список переменной, а затем назначить другой список той же переменной, используя set! но вы никогда не измените свой первый список.

0 голосов
/ 20 марта 2010

(cdr x) (где 'x' - список) даст вам весь список, кроме первого элемента. Проблема с его применением к тому, что у вас есть выше, состоит в том, что apple не является первым элементом: '((apple bob car) (cat dig) (e))). То, что вы дали, это список списков, и первым элементом внешнего списка является список (apple bob car).

Чтобы удалить только «яблоко», вам необходимо выяснить, был ли первый элемент в списке, который вы получили, самим списком, и, если это так, составить список, состоящий из этого списка, с удалением первого элемента (подсказка: рекурсия) , а затем остаток вашего первоначального списка. Если этот первый элемент не является списком, вы просто возвращаете оставшуюся часть списка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...