Язык Common LISP имеет что-то как Интерфейс/классы с реализацией Набора Java?

Я решаю это, используя $ .each и добавляя пары ключ-значение в мои форм-данные.

$.each(personfood.details, function (key, value) {
                personfoods.append("details[" + key + "]",value);
            });
9
задан Paul Wicks 3 October 2008 в 05:17
поделиться

8 ответов

Для быстрого решения просто используйте хеш-таблицы, как был упомянут прежде.

Однако, если Вы предпочитаете более принципиальный подход, можно смотреть на FSet, который является “функциональной относящейся к теории множеств библиотекой наборов”. Среди других это содержит классы и операции для наборов и сумок.

(РЕДАКТИРОВАНИЕ:) Самый чистый путь состоял бы в том, чтобы, вероятно, определить Ваши ориентированные на набор операции как родовые функции. Ряд родовых функций в основном эквивалентен интерфейсу Java, в конце концов. Можно просто реализовать методы на стандартном классе ХЕШ-ТАБЛИЦЫ как первый прототип и позволить другие реализации также.

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

Взгляд на контейнеры статьи. Существует контейнерный класс набора.

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

Вы могли использовать списки, хотя они могут оказаться неэффективными для представления больших наборов. Это сделано с помощью, ПРИМЫКАЮТ или PUSHNEW, чтобы добавить новый элемент к списку, и УДАЛИТЬ или УДАЛИТЬ, чтобы сделать противоположное.

(let ((set (list)))
  (pushnew 11 set)
  (pushnew 42 set)
  (pushnew 11 set) 
  (print set) ; set={42,11}
  (setq set (delete 42 set))
  (print set)) ; set={11}

Одна вещь не упустить является всем, что эти операторы используют EQL по умолчанию для тестирования на потенциальные дубликаты в наборе (как Java использует, равняется методу). Это хорошо для, определяет номера содержания или символы, но для наборов других объектов, 'более глубокий' тест равенства такой столь же РАВНЫЙ должен быть указан как a: ПРОТЕСТИРУЙТЕ ключевой параметр, например, для ряда строк:-

(let ((set (list)))
  (pushnew "foo" set :test #'equal)
  (pushnew "bar" set :test #'equal)
  (pushnew "foo" set :test #'equal) ; EQUAL decides that "foo"="foo"
  (print set)) ; set={"bar","foo"}

Дубликаты Lisp к некоторым Операциям присвоения Java:

5
ответ дан 4 December 2019 в 08:35
поделиться

Да, это имеет наборы. Посмотрите этот раздел по "Наборам" от Практического языка Common LISP.

В основном можно создать набор с pushnew и adjoin, запросите его с member, member-if и member-if-not, и объедините его с другими наборами с функциями как intersection, union, set-difference, set-exclusive-or и subsetp.

5
ответ дан 4 December 2019 в 08:35
поделиться

Легко разрешимое использование хеш-таблицы.

(let ((h (make-hash-table :test 'equalp))) ; if you're storing symbols
  (loop for i from 0 upto 20
        do (setf (gethash i h) (format nil "Value ~A" i)))
  (loop for i from 10 upto 30
        do (setf (gethash i h) (format nil "~A eulaV" i)))
  (loop for k being the hash-keys of h using (hash-value v)
        do (format t "~A => ~A~%" k v)))

выводы

0 => Value 0
1 => Value 1
...
9 => Value 9
10 => 10 eulaV
11 => 11 eulaV
...
29 => 29 eulaV
30 => 30 eulaV
2
ответ дан 4 December 2019 в 08:35
поделиться

Не то, чтобы я знаю, но можно использовать хеш-таблицы для чего-то весьма схожего.

1
ответ дан 4 December 2019 в 08:35
поделиться

Хеш-таблицы Lisp являются базирующимся CLOS. Спецификации здесь.

0
ответ дан 4 December 2019 в 08:35
поделиться

Лично, я просто реализовал бы функцию, которая берет список, и возвратите уникальный набор. Я спроектировал что-то вместе, которое работает на меня:

(defun make-set (list-in &optional (list-out '()))
  (if (endp list-in)
      (nreverse list-out)
      (make-set
        (cdr list-in)
        (adjoin (car list-in) list-out :test 'equal))))

В основном, adjoin функция предварительно ожидает объект к списку непагубно, если и только если объект уже не присутствует в списке, принимая дополнительную тестовую функцию (один из языка Common LISP "равные" функции). Можно также использовать pushnew чтобы сделать так пагубно, но я нахожу, что рекурсивная хвостом реализация намного более изящна. Так, Lisp действительно экспортирует несколько основных функций, которые позволяют Вам использовать список в качестве набора; никакой встроенный тип данных не необходим, потому что можно просто использовать различные функции для преднезаконченных вещей к списку.

Мой источник данных для всего этого (не функция, но информация) был комбинацией языка Common LISP HyperSpec и язык Common LISP Язык (2-й Выпуск).

0
ответ дан 4 December 2019 в 08:35
поделиться
Другие вопросы по тегам:

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