usar porque interfaces implementacion expresiones ejemplos aws java lisp set sbcl

porque - ¿Common Lisp tiene algo así como la interfaz de conjunto de Java/la implementación de clases?



porque usar lambda aws (8)

Las tablas hash de Lisp están basadas en CLOS. Especificaciones aquí .

Necesito algo como esto , una colección de elementos que no contiene duplicados de ningún elemento. ¿Common Lisp, específicamente SBCL, tiene algo como esto?



No es que yo sepa, pero puede usar tablas hash para algo bastante similar.


Para una solución rápida, solo use tablas hash, como se ha mencionado anteriormente.

Sin embargo, si prefiere un enfoque más basado en principios, puede echar un vistazo a FSet , que es "una biblioteca de colecciones teóricas de conjuntos funcionales". Entre otros, contiene clases y operaciones para conjuntos y bolsas.

(EDIT :) La forma más limpia probablemente sea definir tus operaciones orientadas a conjuntos como funciones genéricas. Después de todo, un conjunto de funciones genéricas es básicamente equivalente a una interfaz Java. Simplemente puede implementar métodos en la clase estándar HASH-TABLE como primer prototipo y permitir otras implementaciones también.


Podría usar listas, aunque pueden resultar ineficaces para representar conjuntos grandes. Esto se hace usando ADJOIN o PUSHNEW para agregar un nuevo elemento a una lista, y DELETE o REMOVE para hacer lo opuesto.

(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}

Una cosa a tener en cuenta es que estos operadores usan EQL de forma predeterminada para probar potenciales duplicados en el conjunto (de forma similar a como Java usa el método equals). Eso está bien para conjuntos que contienen números o caracteres, pero para conjuntos de otros objetos, una prueba de igualdad "más profunda" como EQUAL se debe especificar como un parámetro de palabra clave TEST, por ejemplo, para un conjunto de cadenas:

(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"}

Las contrapartes de Lisp en algunas de las operaciones de Set de Java son:


Sí, tiene juegos. Consulte esta sección sobre "Conjuntos" de Practical Common Lisp .

Básicamente, puede crear un conjunto con pushnew y pushnew , consultarlo con member , member-if y member-if-not , y combinarlo con otros conjuntos con funciones como intersection , union , set-difference , set-exclusive-or and subsetp .


Fácilmente solucionable usando una tabla hash.

(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)))

salidas

0 => Value 0 1 => Value 1 ... 9 => Value 9 10 => 10 eulaV 11 => 11 eulaV ... 29 => 29 eulaV 30 => 30 eulaV


Personalmente, simplemente implementaría una función que toma una lista y devuelve un conjunto único. He redactado algo juntos que funciona para mí:

(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))))

Básicamente, la función adjuntar precede un elemento a una lista de forma no destructiva si y solo si el elemento no está ya presente en la lista, aceptando una función de prueba opcional (una de las funciones "iguales" de Common Lisp). También puede usar pushnew para hacerlo de forma destructiva, pero creo que la implementación recursiva de cola es mucho más elegante. Entonces, Lisp exporta varias funciones básicas que le permiten usar una lista como un conjunto; no se necesita ningún tipo de datos incorporado porque puede usar diferentes funciones para anteponer las cosas a una lista.

Mi fuente de datos para todo esto (no la función, sino la información) ha sido una combinación de Common Lisp HyperSpec y Common Lisp the Language (2nd Edition) .