1

私は実際にCommonLispで自分で何かを書き、操車場アルゴリズムを実装することに取り組んでいます。かなり醜く出てきて、そのLispy-nessを疑っても大丈夫だと思いましたが、REPLで関数をテストすると、タイトルにエラーが表示されます。

コードは次のとおりです。テストケースは(shunting-yard '(3 + 5))です。

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

コード自体にエラーがありますか(私の推測)、それとも私のテストケースにありますか?

たくさんの事前のおかげで、これは書くのが本当に楽しかったです、そして私は他の何かに取り組むのを待つことができません、しかし私がこれを動かした後でのみ。

4

1 に答える 1

2

いくつかのエラーがあります:

初め:

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

引用符は行く必要があります。全て。

2番:

(mapcar #'(lambda (x) (eq token x)) '(+ - * / ^))

上記はあなたが思っていることをしていません。MEMBERの呼び出しに置き換えます。

第3:

 (when (< token-precedence stack-precedence)

変数が実際に数値にバインドされていることを確認する必要があります。次のようなものを使用します

 (check-type token-precedence number)
 (check-type stack-precedence number)

チェックとして前に。

さらなるデバッグをお楽しみください...

于 2011-03-02T06:22:34.640 に答える