Advertisement
Guest User

Untitled

a guest
Oct 7th, 2016
427
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.45 KB | None | 0 0
  1. (defvar *infix-precedence* '((* /)
  2.                              (+ -)
  3.                              (> < >= <= == !=)
  4.                              (&&)
  5.                              (||)))
  6.  
  7. (defvar *unary-ops* '(+ -))
  8.  
  9. (defun infix-to-prefix (expr ops stop_ops)
  10.   (cond ((and (listp (car expr)) (not (equal (car (car expr)) 'op-wrapper)))
  11.          (infix-to-prefix
  12.           (nconc
  13.            (infix-to-prefix (car expr) *infix-precedence* nil)
  14.            (cdr expr))
  15.           ops
  16.           stop_ops))
  17.         ((find (car expr) *unary-ops*)
  18.          (infix-to-prefix
  19.           (nconc
  20.            (list (list 'op-wrapper
  21.                        (car expr)
  22.                        (car
  23.                         (infix-to-prefix
  24.                          (list (cadr expr))
  25.                          nil
  26.                          nil))))
  27.            (cddr expr))
  28.           ops
  29.           stop_ops))
  30.         ((equal (car ops) stop_ops)
  31.          expr)
  32.         ((find (cadr expr) (car ops))
  33.          (infix-to-prefix
  34.           (let ((e (infix-to-prefix
  35.                     (cddr expr)
  36.                     *infix-precedence*
  37.                     (car ops))))
  38.             (nconc
  39.              (list (list 'op-wrapper
  40.                          (cadr expr)
  41.                          (car expr)
  42.                          (car e)))
  43.              (cdr e)))
  44.           ops
  45.           stop_ops))
  46.         ((and (cadr expr) (listp (cadr expr)))
  47.          (infix-to-prefix
  48.           (nconc
  49.            (list (nconc
  50.                   (list
  51.                    'op-wrapper
  52.                    (car expr))
  53.                   (mapcar (lambda (x)
  54.                             (car (infix-to-prefix
  55.                                   (list x)
  56.                                   *infix-precedence*
  57.                                   nil)))
  58.                           (cadr expr))))
  59.            (cddr expr))
  60.           ops
  61.           stop_ops))
  62.         (ops
  63.          (infix-to-prefix
  64.           (nconc (list (car expr))
  65.                  (cdr expr))
  66.           (cdr ops)
  67.           stop_ops))
  68.         (T (car expr))))
  69.  
  70. (defmacro op-wrapper (&rest args) args)
  71.  
  72. (defmacro c-expr (&rest expr)
  73.   (car (infix-to-prefix expr *infix-precedence* nil)))
  74.  
  75. (defun == (left right) (equal left right))
  76. (defun != (left right) (not (equal left right)))
  77. (defun && (left right) (and left right))
  78. (defun || (left right) (or left right))
  79.  
  80. (defun sum (x y) (+ x y))
  81.  
  82. (print (c-expr - 2 + sum ( 10 20 ) == 28))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement