Come faccio a formattare un albero in modo che funzioni con la chiusura lampo di Clojure?
-
29-09-2019 - |
Domanda
Sto creando alberi di s-espressioni per un problema di programmazione genetica, e la necessità di parti alter degli alberi durante il processo di evoluzione. Mi sono imbattuto nel href="http://clojure.org/other_libraries" rel="nofollow"> Clojure cerniera funzione
Per esempio, dire creo una cerniera con ho capito questo per rappresentare un albero con + alla radice, quella che assomiglia a questo: Il mio cerniera, però, non è d'accordo con questo: Se chiedo per il primo nodo con Sono abbastanza sicuro che sto rappresentando miei alberi correttamente perché quando li eseguo ho la risposta giusta. Fa cerniera aspettarsi un layout diverso? (def zipped (zip/seq-zip `(+ (- 1 2) 3)))
+
- 3
1 2
(-> zipped zip/down zip/node)
mi dà +
(che è corretto), ma (-> zipped zip/down zip/down)
non mi prendere per -
, ma restituisce nil
. Infatti, (-> zipped zip/down zip/rights)
dà il resto l'albero come fratelli a destra della radice, che mi fa pensare che non ho un albero a tutti: user> (-> zipped zip/down zip/rights)
((clojure.core/- 1 2) 3)
Soluzione
Il problema è che ci sono due idee diverse di albero succedendo qui. L'albero è un grafico di come i valori filtrano attraverso la valutazione, ma LISP sta pensando di elenchi di liste, e utilizzando il prefisso notazione:
'(+ (- 1 2) 3) è anche (lista + (lista - 1 2) 3), che è in realtà questo albero:
+ . 3
- 1 2
(-> zipped down node)
ti dà il primo elemento, +, un atomo.
(-> zipped down down)
ti dà quindi pari a zero, perché il primo elemento, +, è un atomo.
(-> zipped down right down node)
ti dà il segno meno si vuole, perché questo è il primo elemento del secondo elemento dell'espressione.
Altri suggerimenti
L'albero non è come hai diagrammed esso. Il nodo principale ha 3 figli: +
, (- 1 2)
e 3
. Quando si esegue down
dal nodo radice, il valore predefinito è il più a sinistra del bambino, quindi, perché si vede +
.
Per raggiungere l'-
avresti bisogno di chiamare:
user=> (-> zipped zip/down zip/right zip/down zip/node) clojure.core/-