lisp - Common Lisp程序错误

标签 lisp common-lisp

我是 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

谢谢:)

最佳答案

您收到此错误是因为右括号太多:

  (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))))

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

关于lisp - Common Lisp程序错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23773272/

相关文章:

clojure - 翻转 "->"语句中的参数

web - 如何在 hunchentoot 中获取上传文件的创建日期?

lisp - 我可以在 Clisp 中保存源文件吗?

lisp - 垂直对齐 float 在小数点上

list - LISP 的功能语言家族和一个代码片段?

lisp - 用 maxima 语言编码 vs lisp

list - (list 'quote ' 5) = '' 5 而不是 '(quote 5) or ' ('' 5) 的值如何?

Emacs Lisp 打印输出

common-lisp - 如何让展开的 Canvas 填满屏幕的一半以上

lisp - 这是 sbcl 中的错误?