[plt-scheme] How to get the source of procedure?
From: Jaime Vargas (jev at mac.com)
Date: Tue May 16 11:19:57 EDT 2006 |
|
Thanks all for the replies. I am interested on source code
inspection from the point of view of understanding how a particular
procedure was implemented. I understand than on relying on the
implementation of procedure may breaks the contract. However, I think
that inspecting is good for learning.
-- Jaime
On May 16, 2006, at 4:45 AM, Dave Herman wrote:
> Here is a module that defines a special lambda form that allows you
> to create a procedure with a documentation string and its source
> code represented as an S-expression.
>
> Let me warn you about the perils of source code inspection, though.
> In JavaScript, you can access the source code of any function as a
> string. As a result, the browser vendors get bug reports every time
> they make even the slightest changes to the implementation of any
> function: users have written programs that rely on the exact
> representation of the source code, so changes to the implementation
> break the users' code -- sometimes even as mundane as whitespace
> changes! The situation is only marginally better with an S-
> expression representation.
>
> Executive summary: violate abstraction boundaries, and you'll get
> what you deserve. :)
>
> I'll add this to the Scheme Cookbook.
>
> Dave
>
> ;; --
>
> (module doc-lambda mzscheme
> (define-values (struct:doc-lambda make-doc-lambda doc-lambda? doc-
> lambda-ref doc-lambda-set!)
> (make-struct-type 'doc-lambda #f 3 0 #f null #f 0))
>
> (define doc-lambda-proc (make-struct-field-accessor doc-lambda-
> ref 0 'proc))
> (define doc-lambda-doc (make-struct-field-accessor doc-lambda-ref
> 1 'doc))
> (define doc-lambda-src (make-struct-field-accessor doc-lambda-ref
> 2 'src))
>
> (define (procedure-doc x)
> (and (doc-lambda? x)
> (doc-lambda-doc x)))
>
> (define (procedure-source x)
> (and (doc-lambda? x)
> (doc-lambda-src x)))
>
> (define-syntax doc-lambda
> (syntax-rules ()
> [(_ doc-string args body0 body1 ...)
> (let ([doc-string-v doc-string])
> (make-doc-lambda
> (lambda args body0 body1 ...)
> doc-string-v
> `(doc-lambda ,doc-string-v args body0 body1 ...)))]))
>
> (provide doc-lambda procedure-doc procedure-source))
>
> ;; --
>
> Dave
>