2009-10-23 13 views

Répondre

17

Vous pouvez utiliser des structmaps. Pour définir un:

(defstruct bintree :left :right :key) 

Pour faire une instance:

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

Vous pouvez alors accéder aux valeurs de la struct comme ceci:

(:left tree) 

etc.

Ou vous peut créer de nouvelles fonctions d'accesseur:

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

et de l'utiliser:

(left-branch tree) 
+0

En quoi cela est-il préférable à l'utilisation d'une liste ou d'un vecteur imbriqués? – Zaz

+1

C'est mieux parce que les clés sont nommées et qu'elles ont un accès garanti en temps constant (les listes sont linéaires, bien que les vecteurs soient constants). Bien que cela ait été écrit en 2009, beaucoup de choses ont changé depuis. Je ne faisais que recommander 'defstruct' car la question portait sur' define-structure' de scheme. –

1

Je ne connais pas Clojure, mais je parie que c'est comme ça que vous le faites dans Scheme sans define-struct ... juste contre les branches gauche et droite. Pour trouver quelque chose, recurse jusqu'à ce que vous frappiez un atome.

Sérieusement, cependant, structmaps ressemble à ce que vous voulez. J'ai trouvé this page. Recherchez les structmaps à mi-chemin.

1

La façon la plus simple serait d'utiliser l'arbre qui est déjà défini dans la langue (chaque-carte triée est un arbre vraiment, si vous avez juste besoin d'une fonction différente pour comparer les clés, utilisez trié-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

Non trié? Je pense que ce serait un meilleur ajustement, et la clé pourrait faire partie des structures que vous stockez. trié-carte vous oblige à séparer la clé et le gérer séparément pour toujours. –

+0

+1 de toute façon, c'est proche de ce que j'aurais dit, si j'avais vu la question quand elle a été posée. –

Questions connexes