Lisp前缀计算器

Lisp前缀计算器,lisp,scheme,prefix,Lisp,Scheme,Prefix,当计算器应该计算本例中字符之间没有括号的“(+*32-21)”时,如何将计算器写入前缀表示法?当我有括号时,我可以处理它,但在这种情况下,我迷路了。在谷歌上快速搜索生成了wikipedia页面,并使用堆栈实现了前缀求值(伪代码)。这是编写自己的实现的起点。还请注意,可以使用Lisp的链表轻松实现堆栈,只需在头部添加/删除元素。在google上快速搜索wikipedia页面,并使用堆栈实现前缀求值(伪代码)。这是编写自己的实现的起点。还请注意,使用Lisp的链表可以很容易地实现堆栈,只需在头部添加

当计算器应该计算本例中字符之间没有括号的“(+*32-21)”时,如何将计算器写入前缀表示法?当我有括号时,我可以处理它,但在这种情况下,我迷路了。

在谷歌上快速搜索生成了wikipedia页面,并使用堆栈实现了前缀求值(伪代码)。这是编写自己的实现的起点。还请注意,可以使用Lisp的链表轻松实现堆栈,只需在头部添加/删除元素。

在google上快速搜索wikipedia页面,并使用堆栈实现前缀求值(伪代码)。这是编写自己的实现的起点。还请注意,使用Lisp的链表可以很容易地实现堆栈,只需在头部添加/删除元素。

我是scheme的初学者(请原谅,如果这是讨厌的代码)。这是一个括号:

(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'(*32)(+12))

我想把这段代码修复成没有括号的代码,但是条件和列出原始输入阻止了我。我不知道如何编写条件,这样我就不会丢失原始输入,也不会进行最终计算

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

(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))
谢谢你所有的答案和提示:)

我是scheme的初学者(请原谅,如果这是讨厌的代码)。这是一个括号:

(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'(*32)(+12))

我想把这段代码修复成没有括号的代码,但是条件和列出原始输入阻止了我。我不知道如何编写条件,这样我就不会丢失原始输入,也不会进行最终计算

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

(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))
感谢您提供的所有答案和提示:)

要么我们完成了,要么我们需要重做一次以接近完成

(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?
要么我们完成了,要么我们需要重做一次以接近完成

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

提示:这是“波兰语符号”,其算法肯定可以通过谷歌搜索找到。请显示一些努力。两个词:递归下降。提示:这是“波兰语符号”,其算法肯定可以通过谷歌搜索找到。请显示一些努力。两个词:递归下降。“请注意,在这个实现中,输入字符串是从右向左扫描的。”--这实际上是后缀(反向波兰语)表示法的一种算法。这并不重要,因为在Scheme中反转列表很简单。不,链接算法是用于前缀(波兰语)表达式,但输入是从右向左扫描的…所以参数的顺序是颠倒的。对。(我很无聊,刚刚完成了OP的作业。结果我仍然知道足够的方案:)“注意,在这个实现中,输入字符串是从右向左扫描的。”--这实际上是后缀的算法(反向波兰语)符号。这并不重要,因为在Scheme中反转列表很简单。不,链接算法是针对前缀(波兰语)表达式的,但输入是从右到左扫描的…所以参数的顺序是颠倒的。对。(我很无聊,刚刚完成了OP的作业。结果我仍然知道足够的Scheme:)