2010-04-18 5 views
5

Qual è (in termini semplici) la differenza tra l'impostazione di un'associazione (LET) e simboli (= variabili) in comune lisp?common-lisp: differenza tra rilegatura e simbolo

+0

Cosa intendi con "... e simboli (= variabili)"? Puoi darci esempi di espressioni per i due concetti che stai descrivendo? –

risposta

6

I simboli e le variabili sono due tipi di entità molto diversi. Il simbolo è un nome di qualcosa; variabile è un contenitore per un valore. La variabile può essere nominata da un simbolo.

Il collegamento è un'associazione tra un simbolo e una variabile; quando è attivo il binding, puoi fare riferimento a una variabile con il suo nome. let forma crea un tale legame.

+0

Scusa se non ero abbastanza chiaro. Stavo guardando questo tutorial: http://en.wikibooks.org/wiki/Common_Lisp/First_steps/Beginner_tutorial Qual è la differenza tra: (let ((a 1))) e (setf un 1) – martins

+1

(let ((a 1)) ...) crea una variabile (con ambito lessicale locale), un'associazione tra il simbolo A e questa variabile (nel contesto lessicale all'interno del "let" per) e la inizializza su 1. (setf a 1) può comportarsi diversamente: se c'è un legame A, allora cambia il suo valore. Se non esiste alcun binding, crea un binding A globale e lo inizializza a 1. Tuttavia, il tipo di collegamento globale non è specificato e differisce tra le implementazioni Lisp (e le loro versioni). Quindi se si ha una variabile denominata A, setf cambierà il suo valore; altrimenti il ​​risultato non è completamente specificato. –

1

(let ((a 1))) imposta il valore di a su 1 fino al punto in cui la parentesi di chiusura corrisponde alla parentesi di apertura prima che il let sia raggiunto, a quel punto un valore torna a qualsiasi valore precedente (o diventa indefinito). Si vede spesso un let nel corpo di una funzione in cui si richiedono variabili locali che devono uscire dal campo di applicazione alla fine della funzione, quindi si dovrebbe usare una let lì.

(setf a 1) imposta a a 1 e presuppone che uno sia stato precedentemente definito (sia con defparameter, defvariable o let) o che a sia una nuova variabile speciale che ha bisogno di un valore.

È un po 'più complicato di così, ma non sono sicuro di avere le costolette per spiegarlo.