Advertisement
Guest User

Untitled

a guest
Oct 7th, 2016
718
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 2.70 KB | None | 0 0
  1. (defvar *infix-precedence* '(
  2.   (* /)
  3.   (+ -)
  4.   (> < >= <= == !=)
  5.   (&&)
  6.   (||)
  7.   ))
  8.  
  9. (defvar *unary-ops* '(+ -))
  10.  
  11. (defun infix-to-prefix (expr ops stop_ops)
  12.   (cond
  13.     (
  14.       (and (listp (car expr)) (not (equal (car (car expr)) 'op-wrapper)))
  15.       (infix-to-prefix
  16.         (nconc
  17.           (infix-to-prefix (car expr) *infix-precedence* nil)
  18.           (cdr expr)
  19.           )
  20.         ops
  21.         stop_ops
  22.         )
  23.       )
  24.     (
  25.       (find (car expr) *unary-ops*)
  26.       (infix-to-prefix
  27.         (nconc
  28.           (list (list
  29.             'op-wrapper
  30.             (car expr)
  31.             (car
  32.               (infix-to-prefix
  33.                 (list (cadr expr))
  34.                 nil
  35.                 nil
  36.                 )
  37.               )
  38.             ))
  39.           (cddr expr)
  40.           )
  41.         ops
  42.         stop_ops
  43.         )
  44.       )
  45.     (
  46.       (equal (car ops) stop_ops)
  47.       expr
  48.       )
  49.     (
  50.       (find (cadr expr) (car ops))
  51.       (infix-to-prefix
  52.         (let
  53.           (
  54.             (e
  55.               (infix-to-prefix
  56.                 (cddr expr)
  57.                 *infix-precedence*
  58.                 (car ops)
  59.                 )
  60.               )
  61.             )
  62.           (nconc
  63.             (list
  64.               (list
  65.                 'op-wrapper
  66.                 (cadr expr)
  67.                 (car expr)
  68.                 (car e)
  69.                 )
  70.               )
  71.             (cdr e)
  72.             )
  73.           )
  74.         ops
  75.         stop_ops
  76.         )
  77.       )
  78.     (
  79.       (and (cadr expr) (listp (cadr expr)))
  80.       (infix-to-prefix
  81.         (nconc
  82.           (list (nconc
  83.             (list
  84.               'op-wrapper
  85.               (car expr)
  86.               )
  87.             (mapcar
  88.               (function (lambda (x)
  89.                 (car (infix-to-prefix
  90.                   (list x)
  91.                   *infix-precedence*
  92.                   nil
  93.                   ))
  94.                 ))
  95.               (cadr expr)
  96.               )
  97.             ))
  98.           (cddr expr)
  99.           )
  100.         ops
  101.         stop_ops
  102.         )
  103.       )
  104.     (
  105.       ops
  106.       (infix-to-prefix
  107.         (nconc
  108.           (list (car expr))
  109.           (cdr expr)
  110.           )
  111.         (cdr ops)
  112.         stop_ops
  113.         )
  114.       )
  115.     (
  116.       T
  117.       (car expr)
  118.       )
  119.     )
  120.   )
  121.  
  122. (defmacro op-wrapper (&rest args) args)
  123.  
  124. (defmacro c-expr (&rest expr)
  125.   (car (infix-to-prefix expr *infix-precedence* nil))
  126.   )
  127.  
  128. (defun == (left right) (equal left right))
  129. (defun != (left right) (not (equal left right)))
  130. (defun && (left right) (and left right))
  131. (defun || (left right) (or left right))
  132.  
  133. ; (trace infix-to-prefix)
  134.  
  135. (defun sum (x y) (+ x y))
  136.  
  137. (print (c-expr - 2 + sum ( 10 20 ) == 28 ))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement