2014-05-21 82 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