В Clojure является пустой список последовательностью бесконечных пустых указателей?

Я не уверен в других способах сделать это, но здесь - как Вы делаете это в Прототип (учебное руководство JSON) .

new Ajax.Request('/some_url', {
  method:'get',
  requestHeaders: {Accept: 'application/json'},
  onSuccess: function(transport){
    var json = transport.responseText.evalJSON(true);
  }
});

Вызов evalJSON () с истинным, поскольку аргумент санирует входящую строку.

7
задан unj2 23 July 2009 в 20:27
поделиться

4 ответа

Если вы хотите проверить, пуста ли «остальная часть» коллекции, используйте next .

user> (next '(foo bar))
(bar)
user> (next '())
nil
user> (doc next)
-------------------------
clojure.core/next
([coll])
  Returns a seq of the items after the first. Calls seq on its
  argument.  If there are no more items, returns nil.

«nil-punning» (обработка пустой коллекции / seq и nil ] как то же самое) был удален в прошлом году в пользу полностью ленивых последовательностей. См. здесь для обсуждения, ведущего к этому изменению.

10
ответ дан 6 December 2019 в 11:51
поделиться

first и rest - это функции, которые применяются к логической структуре ( seq ), а не к связанной структуре cons списка. (как и в других шепелявых).

Clojure определяет множество алгоритмов в терминах последовательностей (seqs). Seq - это логический список, и в отличие от большинства Лиспов, где список представлен конкретной двухслотовой структурой, Clojure использует интерфейс ISeq, чтобы позволить многим структурам данных предоставлять доступ к своим элементам в виде последовательностей.

http: / /clojure.org/sequences

Поведение является результатом определения функции и не определяется примитивной структурой данных.

4
ответ дан 6 December 2019 в 11:51
поделиться

Также изучает Clojure.

Для пустых последовательностей , rest возвращает последовательность, для которой seq возвращает nil .

Вот почему у вас такое поведение.

Я предполагаю, что это сделано для упрощения рекурсии последовательностей, пока они не станут пустыми, и, возможно, по другим причинам smartypants ...

1
ответ дан 6 December 2019 в 11:51
поделиться

Технически да , но бесполезно.

«Имеет ли последовательность, созданная вызовом (seq '()) бесконечное количество нулей?»
ответ - да, потому что (остальная часть) пустой последовательности остается пустой последовательностью , которая сама может иметь (отдых)

Этот вывод, кстати, вводит в заблуждение:

1:7 user=> (rest '())
()

первый ' () здесь пустой список .
secong () в этом примере - это пустая последовательность .
последовательности печатаются так же, как списки в ответе, даже если они не совпадают.

0
ответ дан 6 December 2019 в 11:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: