Для чего неподходящие списки? - PullRequest
5 голосов
/ 30 января 2012

Это продолжение моего предыдущего вопроса: Зачем нам нужен ноль? Очевидно, что правильные списки используются большую часть времени.Но какова цель неправильного списка?

Ответы [ 4 ]

6 голосов
/ 31 января 2012

Отличный вопрос!(Ну, в любом случае, мне нравится, как Крис переписывает это).По моему опыту, наиболее распространенное использование неправильных списков - это легкие двухэлементные структуры.

Аргументация звучит так: «ну и дела, мне нужна двухэлементная структура. Ой, подождите, почему бы просто не использовать« минусы »? Он встроен и действительно хорошо поддерживается встроеннымив кавычках синтаксиса. Какого черта, я сделаю это. "

В частности, встроенные операции, такие как" Assoc ", часто реализуются таким образом, что предполагается, что ему дан список неправильныхсписки элементов.

5 голосов
/ 31 января 2012

Без веской причины.Единственное, для чего действительно неподходящие списки действительно хороши, это как часть синтаксиса для списков ассоциаций, и даже там, лучше использовать собственный синтаксис для пар ключ-значение.Любое использование неправильных списков, которое вы можете придумать, может быть лучше реализовано с типами записей, которые, в конце концов, включают списки: вы можете определять списки Lisp в терминах записей, но не наоборот (поскольку списки не позволяют вам определятьструктуры данных, тип которых не связан со всеми другими типами языка).

Злоупотребление парами и списками для представления всех типов данных - это то, что я люблю называть болезнь программиста Лиспа , иэто настоящий позор, что многие сторонники Лиспа защищают его.Мне приходилось слишком часто убирать этот материал.

4 голосов
/ 31 января 2012

Наличие неправильного списка является естественным следствием существования фундаментальных строительных блоков cons, car и cdr. В основе lisp лежит то, что эти три формируют основу для всех видов более сложных типов данных. Каким-то образом выделение неправильного списка для изгнания потребует введения произвольных ограничений.

1 голос
/ 31 января 2012

«Неправильный список» - это расплывчатый термин для любого типа данных, кроме списка, который строится с использованием cons.

Один из примеров, как говорит Джон, - использовать пары cons вТочно так же можно использовать кортежи в ML.

Другой пример - это вариация списков.Например, можно определить поток следующим образом:

;; A Stream-of-X is one of
;;   - null, ie '()
;;   - (cons X Stream-of-X)
;;   - a procedure taking no arguments and returning a Stream-of-X result

;; nats-from : nat -> Stream-of-nat
(define (nats-from n)
  (cons n (lambda () (nats-from (+ n 1)))))
...