2010-08-31 8 views
9

Definisco una funzione in LISP e definisce correttamente. Ma ogni volta che provo a chiamarlo, ricevo un errore che dice "La variabile FACTORIAL non è associata."In che modo il mio LISP funziona come una variabile non associata?

Ho provato questo su entrambi OS X e Windows 7, su LispWorks e Allegro. La funzione è -

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x factorial (- 1 x)))) 

Qualsiasi aiuto è apprezzato.

+1

è possibile mostrare il codice in cui si chiama? – atk

risposta

5

sembra che vi state perdendo una serie di parentesi:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- 1 x))))) 

Senza la () intorno factorial, Lisp pensa ti riferisci ad una variabile invece di una funzione.

+0

Quasi-ho quasi perso il '(- 1 x)', anche. Anche se non conosco CL, potrei essere completamente fuori di testa! – Isaac

+3

@Isaac Hodes: L'ho visto anche io, ma ho pensato di lasciarlo come esercizio per l'OP. :) –

16

Nella terza riga del codice, si sta moltiplicando x volte factorial volte 1-x.

La prima cosa da notare è factorial non è una variabile: è una funzione. Come Common-Lisp è un Lisp-2, fattoriale non è associato come una variabile a tutti - è associato come una funzione.

È necessario chiamare la funzione factorial su uno inferiore a x, non su x inferiore a uno.

Quindi:

(defun factorial (x) 
    (if (= 1 x) 1 
     (* x (factorial (- x 1))))) 

... dovrebbe farlo.

1

Per completare la risposta di @Isaac Hodes, questo mostra che c'è chiaramente 2 namspace per funzione e variabile in CL. Non avresti lo stesso errore se fossi nello schema. Puoi leggere di più here.

+1

Sarebbe ancora sbagliato, dal momento che hai ancora bisogno delle parentesi attorno alla chiamata ricorsiva, ma sarebbe sbagliato in un modo più interessante. –

+2

Sì, è così che ho detto "Non avresti lo stesso errore" – mathk

0

È necessario associare tutte le variabili e le chiamate di funzione che si intende utilizzare con parentesi, a meno che non si desideri che siano simboli. A proposito di errori non legati, Paul Graham ha un buon esempio nel suo libro: Ansi Common Lisp

Una delle lamentele più comuni Sentirete da Lisp è che un simbolo non ha alcun valore o è legato. Diversi problemi distinti si presentano in questo modo in . Le variabili locali, come quelle stabilite da let e defun, sono valide solo all'interno del corpo dell'espressione in cui sono state create. Quindi se cerchiamo di fare riferimento a una tale variabile al di fuori del lasciare che la crea:

> (progn (let ((x 10)) 
        (format t "Here x = ~A.~%" x)) 
        (format t "But now it's gone...~%") x) 
Problemi correlati