4 ms·
vref and (setf vref) define getter and setter functions for manipulating pixel arrays. Since these functions are used a lot, it makes sense to allow compiler t
by Nokinside 9y ago
vref and (setf vref) define getter and setter functions for manipulating pixel arrays. Since these functions are used a lot, it makes sense to allow compiler to inline them for maximum speed.
Normally function must be accessed trough the symbol and it can be redefined on the fly.
- sigjuice 9y agoIt would be interesting to do a measurement of inline vs non-inline to see how much of a speed difference it makes.
- lispm 9y agoFunctions don't need to be accessed through them symbol. A file compiler can assume that a function does not change inside a file, etc. Inlining and being called via a symbol are slightly different things... I would also think that lexical functions are not called via symbols...
- veddox 9y agoI understand what they do, and I appreciate that it helps performance to inline them. What I don't understand is the (setf vref) syntax. I thought that after a defun statement you had to have a symbol, not an S-expression? Something like so: (defun-inline set-vref (new-value chip x y) ...) And how would you actually call the original function to set a pixel? (I'm not very familiar with inlines, maybe that's my problem here.)
- reikonomusha 9y agoThis is special syntax in Common Lisp. (SETF F) actually names a function too. It allows you to define a setter (a setf-expansion) with a normal DEFUN.
- juki 9y agoCommon lisp has this universal setter-macro, SETF, which can be used to set values to all sorts of places. In this case you would use (setf (vref chip x y) new-value) to call the function (just like with AREF above). Using SETF has the advantage that you can define "modify macros" that read and write a place. For example, (incf (vref chip x y) delta) would increment the place by DELTA. Or (rotatef (vref chip x1 y1) (vref chip x2 y2)) would swap two pixels.