Abbiamo usato il Lisp nel mio corso di intelligenza artificiale. I compiti che ho ricevuto riguardavano la ricerca e la generazione di strutture ad albero. Per ogni incarico, ho finito per scrivere qualcosa di simile:Come posso SETF un elemento in un albero da un accessor?
(defun initial-state()
(list
0 ; score
nil ; children
0 ; value
0)) ; something else
e costruire le mie funzioni intorno a questi "stati", che sono in realtà solo annidati liste con qualche struttura vagamente definita.
Per rendere la struttura più rigida, ho provato a scrivere di accesso, come ad esempio:
(defun state-score (state)
(nth 2 state))
Questo funziona per la lettura del valore (che dovrebbe essere tutto quello che ho bisogno di fare in un mondo ben funzionale. Tuttavia, mentre il tempo scricchiola, e comincio a scribacchiare follemente, a volte voglio una struttura mutevole). Non mi sembra di essere in grado di SETF la cosa restituita ... (luogo? Valore? Puntatore?).
ho un errore con qualcosa di simile:
(setf (state-score *state*) 10)
A volte mi sembra di avere un po 'più di fortuna scrivendo la funzione di accesso/mutator come macro:
(defmacro state-score (state)
`(nth 2 ,state))
Tuttavia non so perché dovrebbe essere una macro, quindi non dovrei scriverlo come macro (eccetto che a volte funziona. Programmare per coincidenza è male).
Qual è una strategia appropriata per costruire tali strutture?
Ancora più importante, dove posso sapere di cosa sta succedendo qui (quali operazioni influenzano la memoria in che modo)?
@Vijay: usare 'defstruct' è davvero meglio di una lista. Tuttavia, nelle liste dei corsi di base vengono spesso insegnate prima perché sono più semplici e più portabili tra i sapori di lisp (Scheme, ecc.) –