Thanks for positing this. I worked on the raylib 4 bindings for Chicken 5. When chicken switched from version 4 to 5 many bindings needed a re-work. Anyways, raylib has tons and tons of bindings, and the once for Schemes are all somewhat incomplete(like Chicken and Gambit), some do not work at all(e.g. Chibi) and therfor need maintanance. As raylib is evolving so do the bindings and need constant enhancement and fine tuning. I hope projects like this will encourage more people to chime in and maybe help to improve things.
You probably know this already, but something cool the Raylib project does is offer a detailed description of their C API in JSON/XML, meaning that data-driven binding generation can be done.
I'll have to read the paper! Despite working on a library that is inspired in part by SICP (http://www.creativescala.org/doodle/) I've never come across that paper before.
How does the code `((rot triangle) base-box)` work? Is it a higher order function — in LISP the car is taken to be a function name to call, so it seemed odd to me to see a list used for this, `(rot triangle)`.
Yes, `rot` is a higher order function that expects a function argument and returns another function as the result. In Scheme the car does not have to be a name.
This is how evaluation typically works in Lisp-1 (one namespace) dialects. A function call like (cons 1 2) is evaluated by first checking whether cons is a special operator or macro. If it isn't, then all three expressions—cons, 1 and 2—are evaluated in the same way: cons is an ordinary variable whose value is a function. That value is retrieved, and called with the arguments 1 and 2.
In the case of ((rot triangle) base-box) it's the same thing. (rot triangle) is evaluated to produce a function (or function-like object), just like it would be in any other position of the compound form. Then the argument base-box is applied to that.
In Lisp-2 dialects like Common Lisp and Emacs Lisp, the operator position isn't evaluated as an expression. If you need that, a function must be used like funcall: (funcall (rot triangle) base-box).
Lisp-2 dialects are clunky for programming with higher order functions due to the need to use a special operator like function to access the function namespace: (mapcar (function cons) list1 list2) instead of just (mapcar cons list1 list2) and due to the use of the funcall function. However, experience shows that people can write large projects in Lisp-2 dialects without requiring the complexity of a hygienic macro system.