2014-05-21 80 views
-2

在Lisp编程语言中我很新,并且遇到了一个我无法修复的错误:/ 希望有人能帮助我。 (很抱歉,如果这是一个新手的错误)Common Lisp程序错误

这里是我的代码:

(defun inicia() 
(princ "Ingresa la infija") 
(setf temp(read-line)) 
(setf final nil) 
(setf pilatemp nil) 
(setf tamaño (length temp)) 
(setf cont 0) 
(loop 
    (setf cadena (reverse temp)) 
    (if (= cont tamaño) (return)) 
    (setf caracter (string (char temp cont))) 
    (if (= (operando caracter) 1) (push caracter final)) 
    (if (= (operador caracter) 1) (PROGN (loop 
              (if (and (= cont tamaño) (<= (jerarquia caracter) (jerarquia (first pilatemp)))) (return)) 
               (push (first pilatemp) final) 
               (pop pilatemp) 
               (setf cont (+ cont 1)))) 
             (push caracter pilatemp))) 
    (if (equal caracter ")") (push caracter pilatemp)) 
    (if (equal caracter "(") (PROGN (loop 
             (if (string= (first pila) ")") (return)) 
             (push (pop pilatemp) final)) 
            (pop pilatemp))) 
    (setf cont (+ cont 1))) 
(loop 
    (setf tamaño (length pilatemp)) 
    (if (<= tamaño 0) (return)) 
    (if (equal (first pilatemp) ")") (pop pilatemp) (push (pop pilatemp) final)) 
    (setf final (reverse final)))) 
(defun jerarquia(operan) 
    (cond 
     ((string/= operan "^") 8) 
     ((string/= operan "$") 8) 
     ((string/= operan "*") 7) 
     ((string/= operan "/") 6) 
     ((string/= operan "+") 5) 
     ((string/= operan "-") 4) 
     ((string/= operan "(") 3) 
     ((string/= operan ")") 2) 
     ((string/= operan "=") 1) 
     (T 0))) 
(defun operando (operan) 
    (cond 
     ((= (operador operan) 0) 1) 
     ;ojo con el retorno del siguiente if 
     ((string/= operan "(") 1) 
     ((string/= operan ")") 1) 
     (T 0))) 
(defun operador (operan) 
    (cond 
     ((string/= operan "+") 1) 
     ((string/= operan "-") 1) 
     ((string/= operan "*") 1) 
     ((string/= operan "/") 1) 
     ((string/= operan "^") 1) 
     ((string/= operan "$") 1) 
     ((string/= operan "=") 1) 
     (T 0))) 

而我得到的错误是下一个:

-SETQ: variable PILATEMP has no value 

谢谢:)

+4

请正确格式化您的代码并使用'let'来绑定变量。 – sds

+1

由于代码格式不佳,Downvote。 –

+3

请听取sds的建议,并使用'let'来引入局部变量。为此使用'setf'是未定义的行为。另外,为了清楚起见,如果在条件中没有替代分支,则应该使用'when'而不是'if',特别是如果您需要将后续分支包裹在'progn'中,因为'when'会自动执行。 –

回答

2

你由于一个右括号太多而导致此错误太多:

(setf cont (+ cont 1)) ; <--- you had 3 closing parentheses here 
    (loop 
    (setf tamaño (length pilatemp)) 
    (if (<= tamaño 0) (return)) 
    (if (equal (first pilatemp) ")") (pop pilatemp) (push (pop pilatemp) final)) 
    (setf final (reverse final)))) 

所以循环在顶层执行,而不是在函数内部执行。

+0

很多:)抱歉的愚蠢的错误 – osvaldortega