chicken-users
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Chicken-users] Macro expansion help


From: Daniel Leslie
Subject: Re: [Chicken-users] Macro expansion help
Date: Sat, 5 Oct 2013 11:34:51 -0700

If you're considering memoization of an expensive but repeatable computation you may have an easier time of it using parameters rather than syntax.

See define-parameter:
http://wiki.call-cc.org/eggref/4/miscmacros

And parameterize:
http://wiki.call-cc.org/man/4/Non-standard%20macros%20and%20special%20forms#parameterize

And SRFI-39:
http://wiki.call-cc.org/man/4/Parameters

And SRFI-26:
http://wiki.call-cc.org/man/4/Non-standard%20macros%20and%20special%20forms#cut

Anyhow, a few go-to sources for macros:
http://wiki.call-cc.org/man/4/Macros
https://en.wikipedia.org/wiki/Hygienic_macro
https://en.wikipedia.org/wiki/R5RS#Hygienic_macros

As always, check out #chicken on irc.freenode.net for some insightful feedback.

-Dan

On Sat, Oct 5, 2013 at 11:24 AM, Loïc Faure-Lacroix <address@hidden> wrote:
Hi, new to scheme and I'd like to know what is the ideal thing to do for a case like the following. I'd like to  create a library that will compute bezier curves of N order.

I already made a something that seems to work but I believe it could be improved using macro expansion. 

For the people who aren't aware of it, a bezier is a type of curve that has 2 points and n control points. The function can be computed recursively or iteratively. The recursive version is quite trivial to write but will be quite expensive when the bezier has multiple control points. The order of complexity of the recursive algorithm is O(n!) If I'm not mistaken. The use of iterative algorithm would create a version of complexity O(n) Since we have to loop over each points.

Using macro expansion, we could expand the function to sum each points without having to loop over a list of points. Using expansion, we can also replace some of the values with fixed constant.


For example, as I understand, the coefficient in the calc define could be expanded since they we could guess them at compile time. If we create a bezier of 4 points, we will have something like this

(nCr 3 0) = 1
(nCr 3 1) = 3
(nCr 3 2) = 3
(nCr 3 3) = 1

For each call to a bezier with 4 points, it is not necessary to recompute coefficient because they will always be the same. The same things goes for (- n i).

But to be honest, I have no idea how to rewrite a function at compile time. I saw how people use "define-syntax" to add some sugar to the language, but I hardly understand how to actually transform a function using macros. The bezier example should be simple enough to understand how it works.

Once I have this done, I'll write a blog post so other people can get a "painless" introduction to function rewriting. 

Thanks in advance,
Loïc

_______________________________________________
Chicken-users mailing list
address@hidden
https://lists.nongnu.org/mailman/listinfo/chicken-users



reply via email to

[Prev in Thread] Current Thread [Next in Thread]