On 18-Aug-07, at 9:13 AM, andrew cooke wrote:
Hi,
Well, first of all this segfaults: qp6 napito: ./napito-base.scm Segmentation fault which I guess is a bug.
Yes it is. The problem is that your code has a syntax error, so the runtime system tries to raise a syntax error exception. Unfortunately there is a bug in this branch when the code was macro expanded, or passed to eval. Anyway, the fix is to replace the line
(head (##source-code (##car code)))
by
(head (##source-code (##sourcify (##car code) src)))
in lib/_eval.scm and then rebuild Gambit with a make.
But also, I got a bit carried away trying to remove function calls in matrix multiplication. I'd appreciate some advice - if the code worked, would it be efficient? In particular, do the values/receive pairs get "compiled away"?
No they don't. The call (values 1 2 3) actually creates a vector- like object, tagged as a multiple-value. So the code is the same efficiency as (vector 1 2 3). You'll get much better optimization by using a CPS-style. This is easy in your case: just pass in the consumer of your values as a parameter, i.e. replace
(define-syntax row1 (syntax-rules () ((_ a b c d e f) (values a b c))))
(receive (x y z) (row1 1 2 3 4 5 6) (list x y z))
by
(define-syntax row1 (syntax-rules () ((_ a b c d e f consumer) (consumer a b c))))
(row1 1 2 3 4 5 6 (lambda (x y z) (list x y z)))
I am considering adding a deforestation optimization to the Gambit compiler to eliminate the construction of multiple-values objects (and pairs, vectors, etc) when it is easy. But that's still under development.
Marc