Фиксация синтаксиса Lisp

Другой способ использования запроса агрегирования применим только для версии MongoDB> 3.4 -

. Благодарим вас за это сообщение .

Примеры документов для выбирается в этом порядке -

var order = [ "David", "Charlie", "Tess" ];

Запрос -

var query = [
             {$match: {name: {$in: order}}},
             {$addFields: {"__order": {$indexOfArray: [order, "$name" ]}}},
             {$sort: {"__order": 1}}
            ];

var result = db.users.aggregate(query);

Еще одна цитата из сообщения, объясняющая эти операторы агрегирования -

Этап «$ addFields» является новым в версии 3.4 и позволяет вам «создавать» новые поля для существующих документов, не зная всех других существующих полей. Новое выражение «$ indexOfArray» возвращает позицию определенного элемента в заданном массиве.

blockquote>

В основном оператор addToSet добавляет новое поле order в каждый документ, когда он его находит, и это Поле order представляет собой первоначальный порядок нашего массива, который мы предоставили. Затем мы просто сортируем документы на основе этого поля.

15
задан siddhadev 13 March 2009 в 18:22
поделиться

14 ответов

То, что Вы предлагаете, кажется, было реализовано в Редактировании Lispin

: sindikat указывает в комментариях, ниже которых ссылка больше не действительна. Вот последняя действительная версия сайта из веб-Архива: http://wayback.archive.org/web/20080517144846id_/http://www.lispin.org/

12
ответ дан 30 November 2019 в 23:47
поделиться

Вы могли смотреть на Clojure. Меньшие круглые скобки, но больше синтаксиса для запоминания.

0
ответ дан 30 November 2019 в 23:47
поделиться

Мое личное мнение об этом: не используйте новые строки и добавление отступа как "неявные" разделители (мне также не нравится неявная группировка по приоритету оператора, но это - другое, хотя связанная тема).

Пример: этот действительный Python? Это делает то, что Вы ожидаете?

if foo < 0 :
    bar
  else :
    baz
quuz

у меня есть немного предложения: мы могли использовать препроцессор для форматирования кода Python автоматически путем помещения специальных символов в код, которые говорят его, где оператор начинается и заканчивается. Как насчет круглых скобок для этого?

1
ответ дан 30 November 2019 в 23:47
поделиться

Прочитывая ссылки, я нашел этого - Чувствительный к добавлению отступа синтаксис - существует также модуль Хитрости, который реализует этот синтаксис, таким образом, можно было непосредственно попробовать его.

А вполне обещание диалект Lisp (Дуга) мог быть найден здесь . (Я предполагаю, что каждый должен сначала некоторый реальный код видеть, как это чувствует)

0
ответ дан 30 November 2019 в 23:47
поделиться

Отвечать на вопрос почему:

Это - основное использование насколько я знаю, удобочитаемость, так, чтобы люди, которые смотрят на Ваш код, могли дешифровать его более легко.

Hope это помогает.

1
ответ дан 30 November 2019 в 23:47
поделиться

Это могло работать. Это звонило Dylan.

5
ответ дан 30 November 2019 в 23:47
поделиться

Существует два вида people™: те, кто обрабатывает информацию посредством встроенной стековой машины в их мозгах и тех, кто использует ее в больших блоках или блоках. Эти группы являются взаимно несовместимыми друг с другом; они читают различные книги, имеют различные стили записи и, самое главное, пишут код на различных языках программирования. Я принадлежу второй группе; однако, я знаю многих коллег - программистов от первой группы.

Для людей в первой группе, нет абсолютно ничего неправильно с вложенными пунктами и подпунктами; они схватывают рекурсию естественно; они медленно смотрят на код, оператор оператором, линию за линией, и стековая машина в их мозгах сохраняет фигурные скобки подсчета и круглые скобки на подсознательном уровне. Синтаксис Lisp является довольно естественным для них. Черт, они, вероятно изобрели язык Forth и стековые машины. Но покажите им, скажем, Python (о, noes!), и они поглядят беспомощно к листам кода, неспособного понять, почему эти глупые блоки кода оставлены, открывают , без соответствия заключительным операторам.

Для нас, бедных парней во второй группе, нет никаких других операторов кода опции но группы в блоки , и визуально расположите их с отступом. Мы надеемся экранировать заполненный кодом, сначала замечающим крупномасштабную структуру, затем отдельные функции или методы, затем группы операторов в рамках этих методов, затем строки и операторы, сверху донизу. Мы не можем думать линейно; нам нужны визуальные границы и чистые политики добавления отступа. Следовательно, мы не можем изогнуть нас для работы с Lisp; для нас это - неправильная путаница ключевых слов и глупых круглых скобок.

Большинство языков программирования совместимо с обоими способами мышления (те "блоки" там по причине). Существенными исключениями является Lisp и Forth, которые являются первой группой только и Python, который является второй группой только. Я не думаю, что необходимо адаптировать Lisp к образу мыслей, если Вы принадлежите второй группе. При тихой необходимости в функциональном языке судите Haskell. Это - функциональный язык, разработанный для людей, которые думают в блоках, не стеках.

3
ответ дан 30 November 2019 в 23:47
поделиться

Точка шепелявости "синтаксис" является своим несуществованием. S-выражение является деревом идентификационных данных, где древовидная структура обозначена parens ( и добавление отступа). Стоит отметить, что sexps были предназначены, чтобы быть представлением низкого уровня только, но люди закончили тем, что любили его больше и продолжали использовать его.

то, Что выражение значит для механизма выполнения , невероятно гибко в шепелявости, и это также контекстно-зависимо.

На других языках, уровень чувствительности контекста намного ниже и набор стандартных блоков, которые можно использовать для создания собственных абстракций, намного менее свободно расширяемо. Поэтому специальный синтаксис, обозначающий несколько данных конструкций, соответствует изображению.

В шепелявости, я могу изменить значение всего, даже контекстно-зависимым способом. Наличие специального синтаксиса для нескольких предопределенных конструкций было бы глупо, потому что я могу закончить тем, что использовал свое собственное 'если' или мои собственные специализированные закрытия, и т.д. Что, если мое новое, 'если' потребности 4 аргумента (например, сгруппировать определенный if's программы и сказать некоторым группам всегда перестать работать или преуспевать в определенных ситуациях)? Как я должен расширить синтаксис предопределенного 'если'? Намного легче обратиться к AST (sexps), но тогда почему беспокойство со специальным синтаксисом вообще?

Также примечание, что использование редактора как emacs делает очень легким отредактировать такое дерево структурированным способом. Например, наличие ключа для перемещения двух узлов в дереве одинаково полезно, чтобы подкачать объявления переменной и подкачать два оператора в блоке программы (подсказка: вот почему "дополнительные" parens полезны в позволенном, конусовидном, и т.д.).

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

Некоторые примеры определяемого пользователем синтаксиса, который мы используем:

  • cl-syntax-sugar - самое известное расширение [] parens, используемый для крошечных закрытий, где Вы не хотите называть переменные закрытия
  • cl-quasi-quote - прежде всего <xml > синтаксис для встраивания xhtml поколения в коде шепелявости (обратите внимание на то, что, этот синтаксис обеспечивается пользователь библиотека, и это может быть включено контекстно-зависимым способом)
6
ответ дан 30 November 2019 в 23:47
поделиться

Несколько раз я сравнивал код Lisp и эквивалентный код на других языках. Код Lisp имеет больше parens, но если Вы считаете все символы группировки [] {} () на других языках, Lisp имеет меньше parens, чем все они. Это не является более подробным: это более последовательно!

При наблюдении с этой точки зрения "проблема" состоит просто в том, что Lisp использует один тип конструкции (списки) для всего. И это - основание для его макросов, его объектной системы, нескольких ее самых мощных конструкций цикличного выполнения, и так далее. Что Вы рассматриваете как незначительную проблему стиля (скобки выглядели бы более прохладными? вероятно), на самом деле знак питания языка.

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

9
ответ дан 30 November 2019 в 23:47
поделиться

"Возможно, этот процесс должен рассматриваться как обряд посвящения для хакеров Lisp".

- Steele и Gabriel, "Эволюция Lisp", 1993

17
ответ дан 30 November 2019 в 23:47
поделиться

Это было сделано много времен (< двадцать препроцессоров строки сделают чудеса). Но существует также преимущество для наличия их явно. Это доносит параллелизм между кодом и данными, и способом приводит Вас из вида размышления, которое заставляет Вас найти их раздражающими.

Вы могли (для аналогичного примера), берут объектно-ориентированный язык и удаляют всю синтаксическую группировку методов в классы (таким образом, они стали, в действительности, перегруженными функциями). Это позволило бы Вам посмотреть на него больше, поскольку Вы были бы прямой императивный язык, но что-то будет потеряно также.

при рассмотрении шепелявости, Вы, как предполагается, думаете, что "Все - список. Ommm"

(Ну, хорошо, "Ommm" является дополнительным).

27
ответ дан 30 November 2019 в 23:47
поделиться

Вы передумаете, как только Вы пишете несколько макросов.

29
ответ дан 30 November 2019 в 23:47
поделиться

Даже Paul Graham , красноречивый защитник языковой семьи Lisp, раскрыл некоторые скобки со своего собственного диалекта Дуга :

Примечание хакерам Lisp: Если Вы привыкли к стандартному оператору Lisp cond, это если суммы к тому же самому, но с меньшим количеством круглых скобок. Например,

(cond (a b)
      (c d)
      (t e))

становится

(if a b
    c d
    e)

(от Учебное руководство по Дуге)

5
ответ дан 30 November 2019 в 23:47
поделиться

Я опробовал и написал несколько синтаксисов, основанных на отступах. В лучшем случае весь синтаксис изменил свою природу и, следовательно, язык превратился с одного в другой. Хороший основанный на отступах синтаксис больше не похож на лиспа.

Проблема с приданием синтаксического значения отступам не возникает из-за дебатов идиотов и \ t против пробелов. Токенизация не является проблемой, поскольку чтение новых строк и пробелов не должно быть сложнее, чем что-либо еще. Сложнее всего определить, какой отступ должен означать, где он появляется, и как придать ему смысл, не создавая слишком сложный синтаксис для языка.

Я начинаю считать, что исходный синтаксис стиля lisp, в конце концов, лучше, когда вы минимизируете количество скобок с некоторым умным программированием. Это может быть сделано не так просто в текущих реализациях Lisp, но в будущих реализациях Lisp это можно будет сделать проще. Это быстро и просто для синтаксического анализа, когда вам нужно токенизировать всего пару правил, а синтаксический анализ практически отсутствует.

0
ответ дан 30 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

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