-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
謝謝:)
請正確格式化您的代碼並使用'let'來綁定變量。 – sds
由於代碼格式不佳,Downvote。 –
請聽取sds的建議,並使用'let'來引入局部變量。爲此使用'setf'是未定義的行爲。另外,爲了清楚起見,如果在條件中沒有替代分支,則應該使用'when'而不是'if',特別是如果您需要將後續分支包裹在'progn'中,因爲'when'會自動執行。 –