This seems to work (blind hack), I really don't know what syntax-local-make-definition-context and syntax-local-bind-syntaxes does I can only assume that they introduce some kind of bindings in particular context.
(define-syntax (depgraph stx) (syntax-parse stx [(_ ((id:id expr:expr ...) ...)) (define id-lst (syntax->list #'(id ...))) (define ctx (syntax-local-make-definition-context)) (syntax-local-bind-syntaxes id-lst #f ctx) (with-syntax ([p #'((lambda () expr ...) ...)]) (define p-lst (syntax->list #'p)) (define vars (map (lambda (e) (free-vars (local-expand e 'expression '() ctx))) p-lst)) (with-syntax ([((f ...) ...) vars]) #''((id (f ...)) ...)))])) (define simple-arith (depgraph ((a #f) (b (* 3 a)) (c (+ 5 a b)) (d (let ((a 9)) (- c a))) ))) simple-arith ;((a ()) (b (a)) (c (b a)) (d (c))) On Wed, Jan 18, 2012 at 1:46 PM, Marijn <hk...@gentoo.org> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 17-01-12 16:14, Sam Tobin-Hochstadt wrote: > > On Tue, Jan 17, 2012 at 4:06 AM, Marijn <hk...@gentoo.org> wrote: > >> On 16-01-12 15:28, Sam Tobin-Hochstadt wrote: > >>> On Mon, Jan 16, 2012 at 7:57 AM, Marijn <hk...@gentoo.org> > >>> wrote: > >>>> > >>>> ((_ ((id rule) ...)) (with-syntax (((dep ...) (free-vars > >>>> (expand #'(rule ...))))) > >>> > >>> You need to use `local-expand', not `expand', here. Probably > >>> like this: > >>> > >>> (local-expand #'(rule ...) 'expression '()) > >>> > >> > >> If I use that instead I still get the same error. Perhaps it > >> needs to be something like: > >> > >> (local-expand #'(rule ...) 'expression '(id ...)) > >> > >> but '(id ...) is not in the right form... > > > > Ah, I see the problem. You're trying to expand expressions with > > unbound variables, and they give an expansion error as they > > should. You might be able to use the stop list to make this work, > > but the right solution is to bind the variables. > > I don't understand how or where I should bind these identifiers that > I'm trying to detect are free. A working example of how to use > free-vars would really help. > > Marijn > -----BEGIN PGP SIGNATURE----- > Version: GnuPG v2.0.18 (GNU/Linux) > Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/ > > iEYEARECAAYFAk8Wf/gACgkQp/VmCx0OL2xItQCcDVKB+NzajXbsjg9JfIoUZvSP > PG4An0aV6d4XuZeBQNQqj+rtNnx6yCuz > =0a9B > -----END PGP SIGNATURE----- > ____________________ > Racket Users list: > http://lists.racket-lang.org/users >
____________________ Racket Users list: http://lists.racket-lang.org/users