[pro] Compiler APIs in Common Lisp

Mark Cox markcox80 at gmail.com
Tue Apr 12 08:46:47 UTC 2011


On 12/04/2011, at 7:45 AM, Matthew Swank wrote:

> I am current reading an interesting paper on Racket's macro system (referenced
> here: http://lambda-the-ultimate.org/node/4196
> ), and some of the objects they expose quack like CLTL-2 Environments:
> http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node102.html. I have read that
> having write access to environments makes it hard for the compiler to optimize
> code. However, even portable read only access would be helpful. Does anyone
> besides me and Cyrus Harmon (http://cyrusharmon.org/blog/display?id=113)
> miss Environments?

Alas, I wish I had been exposed to them before. Until Cyrus' post I had no knowledge of them. I thank Cyrus for making that post. Using the function CLTL2 VARIABLE-INFORMATION function, I produced the following higher level functionality as a proof of concept for an idea I have for a mathematical optimisation library.

(type-dispatching-defun matrix-add (y x scalar)
 (assert (= (array-total-size y)
            (array-total-size x)))
 (dotimes (index (array-total-size x))
   (declare (type fixnum index))
   (setf (row-major-aref y index) 
 	  (+ (* scalar (row-major-aref x index))
     	     (row-major-aref y index))))
 y)

(add-type-specific-function 'matrix-add
			    '((simple-array single-float (*))
			      (simple-array single-float (*))
			      single-float))

(defun time-generic ()
 (let ((a (make-array 1000 :initial-element 1))
       (b (make-array 1000 :initial-element 2)))
   (time (dotimes (i 100000)
	    (matrix-add a b 2.0)))))

(defun time-single-float-array ()
 (let ((a (make-array 1000 :initial-element 1.0 :element-type 'single-float))
       (b (make-array 1000 :initial-element 2.0 :element-type 'single-float)))
   (declare (type (simple-array single-float (*)) a b))
   (time (dotimes (i 100000)
	    (matrix-add a b 2.0)))))


TESTS> (time-generic)
Evaluation took:
 8.004 seconds of real time
 8.000982 seconds of total run time (7.997856 user, 0.003126 system)
 99.96% CPU
 15,929,157,645 processor cycles
 0 bytes consed

TESTS> (time-single-float-array)
Evaluation took:
 0.430 seconds of real time
 0.429092 seconds of total run time (0.428791 user, 0.000301 system)
 99.77% CPU
 854,425,193 processor cycles
 0 bytes consed

Given the possibilities it offers, I am interested to know why it isn't part of the standard. 

Thanks for the Racket links, I will have a read.

Mark

> Matt
> 
> 
> _______________________________________________
> pro mailing list
> pro at common-lisp.net
> http://common-lisp.net/cgi-bin/mailman/listinfo/pro





More information about the pro mailing list