Guest User

Untitled

a guest
May 11th, 2012
38
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lisp 1.01 KB | None | 0 0
  1. (in-package #:burning-cgen-test)
  2. (in-language :c)
  3.  
  4. #G
  5. (include "stdio.h")
  6.  
  7. (def-cg-macro compare (a b then-close &optional else-close)
  8.   `(if (> ,a ,b) ,then-close ,@(if else-close (list else-close) nil)))
  9.  
  10. (def-cg-macro swap (a-addr b-addr)
  11.   `(let ((tmp (deref ,a-addr)))
  12.      (setf (deref ,a-addr) (deref ,b-addr))
  13.      (setf (deref ,b-addr) tmp)))
  14.  
  15. (def-cg-macro compare-and-swap (a b)
  16.   (with-gensyms (a-addr b-addr)
  17.     `(let ((,a-addr (addr ,a))
  18.        (,b-addr (addr ,b)))
  19.        (compare (deref ,a-addr) (deref ,b-addr)
  20.         (swap ,a-addr ,b-addr)))))
  21.  
  22. #G
  23. (defun sort (array length)
  24.   (declare (type (array int) array)
  25.        (type int length))
  26.   (for ((i :from (1- length) :downto 1))
  27.     (for ((j :from 0 :lessto i))
  28.       (compare-and-swap (aref array j) (aref array (1+ j))))))
  29.  
  30. #G
  31. (defun main ()
  32.   (let ((array (make-array :element-type int :initial-contents (7 3 5 2 6 3 5 7))))
  33.     (sort array (length array))
  34.     (for ((i :from 0 :lessto (length array)))
  35.       (printf "%d " (aref array i)))))
Advertisement
Add Comment
Please, Sign In to add comment