Post Reply 
Conversion: Algebraic - Polish - Reverse Polish - LISP ?
11-03-2024, 08:07 PM
Post: #16
RE: Conversion: Algebraic - Polish - Reverse Polish - LISP ?
Here is a quick and dirty translation of rpn-aux, from Chez scheme rpn macro
(I cut corners with 'dup', without assigning result to a variable)

Code:
(defun ^(x y) (expt x y)) ; need common.lsp expt
(defun rpn2(lst) (scan2 (cdr lst) (car lst) nil))

(defun scan2(e t s) ; e=expression, t=top of stack, s=stack
    (cond
        ((null e)   ; return stack
            (if (null s) t (cons t s)))
        ((member (car e) '(+ - * / ^))
            (scan2 (cdr e) (list (car e) (car s) t) (cdr s)))
        ((eq (car e) '@)
            (scan2 (cdr e) (list t (car s)) (cdr s)))            
        ((eq (car e) 'swap) 
            (scan2 (cdr e) (car s) (cons t (cdr s))))
        ((eq (car e) 'dup) 
            (scan2 (cdr e) t (cons t s)))
        (else       ; push data
            (scan2 (cdr e) (car e) (cons t s)))))

D:\MULISP> mulisp common

; I have not figured out how to load lisp code, so I just cut/paste to muLisp REPL

$ (rpn2 '(x 1 x 1 x - * + * x sin @ *))
(* (* X (+ 1 (* X (- 1 X)))) (SIN X))

; Mach number example

$ (eval (rpn2
      '(350 661.5 / 2 ^ 0.2 * 1 + 3.5 ^ 1 -
      1 0.000006875 25500 * - -5.2656 ^ *
      1 + 0.286 ^ 1 - 5 * sqrt @)))

0.8357245
Find all posts by this user
Quote this message in a reply
Post Reply 


Messages In This Thread
RE: Conversion: Algebraic - Polish - Reverse Polish - LISP ? - Albert Chan - 11-03-2024 08:07 PM



User(s) browsing this thread: 7 Guest(s)