首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >常见的Lisp错误:期望类型:实际数据:空

常见的Lisp错误:期望类型:实际数据:空
EN

Stack Overflow用户
提问于 2011-03-02 12:12:16
回答 1查看 1.3K关注 0票数 1

我正致力于用Common Lisp编写一些自己的东西,实现分流码数算法。我认为它运行得很好,即使它相当难看,如果我怀疑它的可读性,但在测试REPL中的函数时,我得到了标题中的错误。

代码如下,测试用例为(shunting-yard '(3 + 5))

代码语言:javascript
复制
(defparameter *output-queue*   nil)
(defparameter *operator-stack* nil)

(defun determine-precedence (operator)
  (case operator
    (('+ '-) 2)
    (('* '/) 3)
    ('^      4)))

(defun shunting-yard (stmt)
  (loop until (null stmt) do
       (let ((token (car stmt)))
         (cond ((or (numberp token)
            (eq token '\())
            (setf *output-queue* (cons token *output-queue*)))
               ((mapcar #'(lambda (x) (eq token x)) '(+ - * / ^))
            (let* ((token-precedence (determine-precedence token))
                   (stack-topmost (car *operator-stack*))
                   (stack-precedence (determine-precedence stack-topmost)))
              (when (< token-precedence stack-precedence)
                (setf *output-queue* (cons stack-topmost *output-queue*))
                (setf *operator-stack* (cdr *operator-stack*)))
              (setf *operator-stack* (cons token *operator-stack*))))
               ((eq token '\))
            (loop for stack-topmost in *operator-stack*
               until (eq stack-topmost '\()
               do (progn
                (setf *output-queue* (cons stack-topmost *output-queue*))
                (setf *operator-stack* (cdr *operator-stack*)))
               finally (setf *operator-stack* (cdr *operator-stack*)))))
         (setf stmt (cdr stmt))))
  (loop while (not (null *operator-stack*))
     do (progn
      (setf *output-queue* (cons (car *operator-stack*) *output-queue*))
      (setf *operator-stack* (cdr *operator-stack*))))
  (nreverse *output-queue*))

错误是在代码本身(我的猜测)还是在我的测试用例中?

提前感谢,写这篇文章真的很有趣,我迫不及待地想做其他的事情,但只有在我把它写好之后。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-02 14:22:35

有几个错误:

首先:

代码语言:javascript
复制
(defun determine-precedence (operator)
  (case operator
    (('+ '-) 2)
    (('* '/) 3)
    ('^      4)))

引文需要去掉。全。

第二:

代码语言:javascript
复制
(mapcar #'(lambda (x) (eq token x)) '(+ - * / ^))

上面的并不是你想的那样。将其替换为对MEMBER的调用。

第三:

代码语言:javascript
复制
 (when (< token-precedence stack-precedence)

您需要确保变量真正绑定到数字。使用像这样的东西

代码语言:javascript
复制
 (check-type token-precedence number)
 (check-type stack-precedence number)

以前是支票。

祝进一步调试愉快...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5163302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档