lilypond-user
[Top][All Lists]
Advanced

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

Re: getting the argument list of a procedure


From: David Nalesnik
Subject: Re: getting the argument list of a procedure
Date: Fri, 6 Mar 2015 11:53:56 -0600

Hi Anders,

On Thu, Mar 5, 2015 at 1:42 PM, <address@hidden> 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


reply via email to

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