2009-10-23 13 views

Respuesta

17

Puede usar structmaps. Para definir una:

(defstruct bintree :left :right :key) 

Haciendo ejemplo:

(struct-map bintree :left nil :right nil :key 0) 

luego podrás acceder a los valores de la estructura como esta:

(:left tree) 

etc.

O puede crear nuevas funciones de acceso:

(def left-branch (accessor bintree :left)) 

y utilizarla:

(left-branch tree) 
+0

¿Cómo es esto mejor que usar una lista anidada o un vector? – Zaz

+1

Es mejor porque las claves tienen nombre y tienen acceso garantizado a tiempo constante (las listas son de acceso lineal, aunque los vectores son constantes). Aunque esto fue escrito en 2009, y mucho ha cambiado desde entonces. Solo estaba recomendando 'defstruct' porque la pregunta era sobre 'define-structure' del esquema. –

1

No sé Clojure, pero apuesto a que es la misma forma en que lo haces en Scheme sin define-struct ... solo contra las ramas izquierda y derecha. Para encontrar algo, recurse hasta que golpee un átomo.

En serio, structmaps suena como lo que quieres. Encontré this page. Busque structmaps a mitad de camino.

1

La forma más sencilla sería utilizar el árbol que ya está definido en el lenguaje (cada-mapa Ordenado es un árbol de verdad, si sólo tiene funciones diferentes para comparar claves, use sorted-map-by).

;;define function for comparing keys 
(defn compare-key-fn [key1 key2] (< key1 key2)) 

;;define tree and add elements 
(def my-tree 
    (->        ;;syntax sugar 
    (sorted-map-by compare-key-fn) ;;this returns empty tree with given function to compare keys 
    (assoc 100 "data for key = 100") ;;below we add elements to tree 
    (assoc 2 "data for key = 2") 
    (assoc 10 "data for key = 10") 
    (assoc -2 "data for key = -1"))) 

;;accesing elements by key 
(prn "element for key 100 =" (my-tree 100)) 

;;"erasing" elements from tree - in reality, what we are really doing, is returning a new tree that contains all elements of the old one, except the element we've just erased. 
(def my-new-tree 
    (dissoc my-tree 2)) 

(prn my-new-tree) ;; to verify, that element 2 is "erased" 
+1

¿No está ordenado? Creo que sería una mejor opción, y la clave podría ser parte de las estructuras que almacena. El mapa ordenado te obliga a separar la clave y manejarla por separado para siempre. –

+0

+1 de todos modos, está cerca de lo que hubiera dicho, si hubiera visto la pregunta cuando se le preguntó. –

Cuestiones relacionadas