Lisp前缀计算器

时间:2013-04-23 16:03:53

标签: lisp scheme prefix

如何将计算器写入前缀表示法,何时计算此示例'(+ * 3 2 - 2 1),其中字符之间没有括号?当我有括号时,我可以处理它,但在这种情况下我迷路了。

3 个答案:

答案 0 :(得分:3)

快速搜索google产生了this维基百科页面,其中包含使用堆栈进行前缀评估的实现(伪代码)。这是编写自己的实现的起点。另请注意,使用Lisp的链接列表可以轻松实现堆栈,只需在头部添加/删除元素。

答案 1 :(得分:0)

我是计划的初学者(对不起,如果它是讨厌的代码)。这个是括号:

(define (fce a)
  (case a
    (( + ) +)
    (( - ) -)
    (( * ) *)
    (( / ) /)))

(define (analyze vyraz)
  (if (list? vyraz)
      (calcul vyraz)
      vyraz))

(define (calcul vyraz)
  (if (= (length vyraz) 3 )
      ((fce (car vyraz)) (analyze (cadr vyraz)) (analyze (caddr vyraz)))
      (calcul (cons (calcul (list (car vyraz) (cadr vyraz) (caddr vyraz) (cadddr vyraz)))))))

此代码可以计算如下:(calcul '(- (* 3 2)(+ 1 2))

我想将此代码修复为无括号的代码,但条件和列出原始输入阻止了我。我不知道如何编写条件,以便我没有丢失原始输入,也进行了最终计算。

有我的条件(但我认为,语法错误

(define (count vyraz)
  (cond (list? vyraz)
        (number? (car vyraz) (cons (car vyraz)))
        (number? (cdr vyraz) (cons (cdr vyraz)))
        (symbol? (cddr vyraz) (cons (cddr vyraz)))
        (else (cdr vyraz) (count vyraz))) 
  (calcul vyraz))

感谢您的所有答案和提示:)

答案 2 :(得分:0)

(define (polish-notation-eval expr)
 (if (finished? expr) 
     (car expr)
     (polish-notation-eval (the-once-over expr)))) 

;;要么我们完成了,要么我们需要做一次性接近完成。

(define (the-once-over expr)
  (cond ((null? expr) expr )
    ((well-formed-expr? expr)
     (cons ((get-operator (car expr)) (cadr expr) (caddr expr))
           (the-once-over (cdddr expr))))
    (else (cons (car expr) (the-once-over (cdr expr))))))

;;只需向下滚动列表,寻找要评估的格式良好的表达式。

(define *the-operations*
  (list (list '+ +)
    (list '* *)
    (list '- -)
    (list '/ /)))

;;具有名称和功能的关联列表

(define (get-operator name)
  (cadr (assoc name *the-operations*)))

;;返回名称为

的函数
(define (finished? expr) 
 (= (length expr) 1))

;;我们完成了一个长度列表,否则不是

(define (well-formed-expr? expr)
 (and (assoc (car expr) *the-operations*) 
      (number? (cadr expr))
      (number? (caddr expr))))
 ;;are the next three elements something we can go ahead and evaluate?