2010-08-31 4 views
9

Defino una función en LISP y define correctamente. Pero cada vez que trato de llamarlo, aparece un error que dice "La variable FACTORIAL está desatada".¿Cómo funciona mi LISP como una variable independiente?

He intentado esto tanto en OS X como en Windows 7, en LispWorks y Allegro. La función es -

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

Se agradece cualquier ayuda.

+1

puede mostrar el código en el que se dice? – atk

Respuesta

5

Parece que se está perdiendo un conjunto de paréntesis:

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

Sin la () alrededor factorial, Lisp piensa que usted se refiere a una variable en lugar de una función.

+0

Casi, casi me perdí el '(- 1 x)', también. ¡Aunque no conozco CL, entonces podría estar totalmente fuera! – Isaac

+3

@Isaac Hodes: Lo vi también, pero pensé que lo dejaría como un ejercicio para el OP. :) –

16

En la tercera línea de su código, está multiplicando x veces factorial veces 1-x.

Lo primero que hay que notar es factorial no es una variable: es una función. Como Common-Lisp es un Lisp-2, factorial no está vinculado como una variable en absoluto, está obligado como una función.

Debe llamar a la función factorial en una menos de x, no x menos de una.

Así:

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

... debería hacerlo.

1

Para completar la respuesta de @Isaac Hodes, esto le muestra que hay claramente 2 namspace para la función y variable en CL. No tendrías el mismo error si estuvieras en el esquema. Puede leer más here.

+1

Todavía estaría mal, ya que todavía necesita los paréntesis alrededor de la llamada recursiva, pero sería incorrecto de una manera más interesante. –

+2

Sí, así es como dije "No tendrías el mismo error" – mathk

0

Debe enlazar todas las variables y llamadas de función que pretenda utilizar con corchetes a menos que desee que sean símbolos. Acerca de los errores no unidas, Paul Graham tiene un buen ejemplo en su libro: Ansi Common Lisp

Una de las quejas más comunes que escuchará de Lisp es que un símbolo no tiene valor o no está consolidado. Varios problemas distintos se muestran en de esta manera. Las variables locales, como las establecidas por let y defun, son válidas solo dentro del cuerpo de la expresión donde se crean. Así si tratamos de hacer referencia a una variable tales fuera del let que lo crea:

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