Hi Anders,
On Thu, Mar 5, 2015 at 1:42 PM, <[email protected]> wrote:
> >>>>> "D" == David Nalesnik writes:
>
> D> What you are suggesting seems to be analogous to what is already
> D> done for the functions on the Scheme functions documentation page
> D> I referenced earlier.
>
> Ah, but you've got all you need there already it seems.
>
> 'procedure-source will return the body of any defined function, then
> just grab the cadr of this to get the lambda-list:
>
> (define (get-proc-args proc)
> (cons (procedure-name proc) (cadr (procedure-source proc))))
>
> (begin
> (newline)
> (display (get-proc-args get-chord-shape))
> (newline)
> (display (procedure-source get-proc-args)))
>
> will return :
>
> (get-chord-shape shape-code tuning base-chord-shapes)
> (lambda (proc) (cons (procedure-name proc) (cadr (procedure-source proc))))
>
>
I like the approach with the macro because then it is easy to mark certain
functions as receiving documentation.
The other alternative would be to provide a list of functions to document.
The first option is nice because we look in one place in the code to see
that it's a documented function, whereas in the second approach, there is
some list in some other file to consider.
____
Trying to experiment with the macros you provided earlier is giving me some
trouble.
Within an LY file this works just fine:
%%%%%%%%%%%%%
\version "2.19.16"
#(use-modules (ice-9 syncase))
%#(use-syntax (ice-9 syncase))
#(define procargstable '())
#(let-syntax ((defineS
(syntax-rules ()
((defineS (proc . args) body)
(begin
(set! procargstable (cons '(proc args) procargstable))
(define (proc . args) body))))))
(defineS (foo a b)
(+ a b)))
#(format #t "table: ~a~%(foo 1 2) ==> ~a~%" procargstable (foo 1 2))
%%%%%%%%%%%%%
However, this does not work:
%%%%%%%%%%%%%
\version "2.19.16"
#(use-modules (ice-9 syncase))
#(define procargstable '())
#(define-syntax defineS
(syntax-rules ()
((defineS (proc . args) body)
(begin
(set! procargstable (cons '(proc args) procargstable))
(define (proc . args) body)))))
%%%%%%%%%%%%%%%
I get the following output:
[...] error: GUILE signaled an error for the expression beginning here
#
(define-syntax defineS
Wrong type to apply: #<Music function #<procedure #f (parser location arg)>>
fatal error: failed files:
"c:\\users\\david\\appdata\\local\\temp\\frescobaldi-4kllxf\\tmpma8ecw\\
let-syntax.ly"
Exited with return code 1.
I am able to use the define-syntax form within scm/output-lib.scm, but I
get the same sort of error when the name of the new function conflicts with
a name already in use, as when I try to define the function 'bar' you
provided in your example.
I don't understand what is happening when I attempt to define the macro in
the LY file, though.
Best,
David
_______________________________________________
lilypond-user mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/lilypond-user