I think this means that (car (generate-temporaries '(t))) is a template id. So the next question would be whether R6RS, by saying "Each temporary...is different from all other identifiers" is implicitly saying that the context of the temporary is empty. Should it be read that way? It's not clear what the context should be for a generated temporary: two candidates in my mind are the empty context, or the context of the call to generate-temporaries.
On Fri, Jun 19, 2009 at 4:56 PM, leppie<xacc....@gmail.com> wrote: > A template id is according to R6RS: > > From: > http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-13.html#node_chap_12 > > (syntax <template>) syntax > > Note: #’<template> is equivalent to (syntax <template>). > > A <template> is a pattern variable, an identifier that is not a pattern > variable, a pattern datum, or one of the following. (etc ...) > > So, a template id is implicitly 'identifier?' > > Cheers > > leppie > > > On Fri, Jun 19, 2009 at 8:22 AM, Ramana Kumar <ramana.ku...@gmail.com> > wrote: >> >> > You're still using a syntax object in datum->syntax rather than a >> > "template id". Does anyone know what a template id is? >> >> I have been guessing that a template id is the pattern variable called >> "id" in either of the lines: >> (syntax-case stx () >> ((id . <>) <>) >> (id <>)) >> >> Does that match anyone else's guess - maybe it was written somewhere >> and I picked it up? >> >> On Fri, Jun 19, 2009 at 8:34 AM, Ramana Kumar<ramana.ku...@gmail.com> >> wrote: >> > You're still using a syntax object in datum->syntax rather than a >> > "template id". Does anyone know what a template id is? >> > >> > Here's another version that works (I claim) (in Ikarus - I don't have >> > the others) for all but two identifiers, and so may give a hint to >> > what's going on. >> > >> > % cat unbound.scm >> > (library (unbound) >> > (export unbound-identifier?) >> > (import (rnrs) (empty-ctxt)) >> > (define (unbound-identifier? x) >> > (free-identifier=? x (datum->syntax empty-ctxt (syntax->datum x))))) >> > >> > % cat empty-ctxt.scm >> > (library (empty-ctxt) >> > (export empty-ctxt) >> > (import (only (rnrs) define syntax)) >> > (define empty-ctxt (syntax empty-ctxt))) >> > >> > % cat t.ss >> > (import (rnrs) (unbound)) >> > (define-syntax if-unbound >> > (lambda (x) >> > (syntax-case x () >> > [(_ (id) then else) >> > (if (unbound-identifier? #'id) #'then #'else)]))) >> > >> > >> > (define-syntax when-bound >> > (syntax-rules () >> > [(_ (id) e* ...) >> > (if-unbound (id) (begin) (begin e* ...))])) >> > >> > (define-syntax when-unbound >> > (syntax-rules () >> > [(_ (id) e* ...) >> > (if-unbound (id) (begin e* ...) (begin))])) >> > >> > (when-bound (let) >> > (display "let is bound\n")) >> > >> > (when-bound (foo) >> > cannot happen) >> > >> > (define-syntax q1 >> > (syntax-rules () >> > [(_) >> > (begin >> > (define q1* 12) >> > (when-bound (q1*) (display "q1 is bound\n")))])) >> > (q1) >> > >> > (when-bound (q1*) (display "q1* is bound\n")) >> > >> > (define-syntax q2 >> > (syntax-rules () >> > [(_ q2) >> > (begin >> > (define q2 12) >> > (when-bound (q2) (display 'q2) (display " is bound\n")))])) >> > >> > (q2 quux) >> > >> > (define-syntax q3 >> > (syntax-rules () >> > [(_ q3 q4) >> > (begin >> > (define q3 12) >> > (when-bound (q4) (display 'q4) (display " is bound\n")))])) >> > >> > (q3 quux1 quux1) >> > (q3 quux2 quux3) >> > >> > (define a.cons 12) >> > (when-bound (a.cons) (display "a.cons bound\n")) >> > (when-bound (cons) (display "cons bound\n")) >> > >> > % cat t2.ss >> > (import (unbound) (prefix (rnrs) r.)) >> > (r.when (unbound-identifier? (r.syntax syntax)) >> > (r.display "syntax unbound") >> > (r.newline)) >> > >> > (r.when (unbound-identifier? (r.syntax define)) >> > (r.display "define unbound") >> > (r.newline)) >> > >> > (r.when (unbound-identifier? (r.syntax when)) >> > (r.display "when unbound") >> > (r.newline)) >> > >> > (r.when (unbound-identifier? (r.syntax foo)) >> > (r.display "foo unbound") >> > (r.newline)) >> > >> > % scheme-script t.ss >> > let is bound >> > q1 is bound >> > quux is bound >> > quux1 is bound >> > a.cons bound >> > cons bound >> > >> > % scheme-script t2.ss >> > when unbound >> > foo unbound >> > >> > On Fri, Jun 19, 2009 at 5:55 AM, Abdulaziz Ghuloum<aghul...@gmail.com> >> > wrote: >> >> >> >> On Jun 18, 2009, at 4:42 PM, Ramana Kumar wrote: >> >> >> >>>> I already said I don't think it's 100% correct, but it works >> >>>> on most implementations, and it satisfies your requirements. >> >>>> If you don't want to use it, that's absolutely fine. >> >> >> >>> Oh I do want to use it =) But I also want to see the 100% correct >> >>> version >> >>> =P >> >> >> >> Okay. We ditch generate-temporaries which had underspecified >> >> behavior. How about the following? [An idea clicked in my >> >> head, I wrote it down, and it worked the first time, and when >> >> I read the solution (2 lines really), it made no sense at all! >> >> This is bizarre! Thanks Ramana! Maybe someone can explain it >> >> to me. :-)] >> >> >> >> Aziz,,, >> >> >> >> PS. ypsilon still misses one test case >> >> >> >> $ ls b/* >> >> b/bound.sls b/bound1.sls b/bound2.sls >> >> >> >> $ cat b/bound* >> >> #!r6rs >> >> (library (b bound) >> >> (export unbound-identifier?) >> >> (import (rnrs) (b bound1) (b bound2)) >> >> (define (unbound-identifier? x) >> >> (and >> >> (free-identifier=? x (datum->syntax a.ctxt (syntax->datum x))) >> >> (free-identifier=? x (datum->syntax b.ctxt (syntax->datum x)))))) >> >> >> >> #!r6rs >> >> (library (b bound1) >> >> (export a.ctxt) >> >> (import (prefix (rnrs) a.)) >> >> (a.define a.ctxt (a.syntax here))) >> >> >> >> #!r6rs >> >> (library (b bound2) >> >> (export b.ctxt) >> >> (import (prefix (rnrs) b.)) >> >> (b.define b.ctxt (b.syntax here))) >> >> >> >> $ cat t.ss >> >> #!r6rs >> >> (import (rnrs) (for (b bound) expand)) >> >> >> >> (define-syntax if-unbound >> >> (lambda (x) >> >> (syntax-case x () >> >> [(_ (id) then else) >> >> (if (unbound-identifier? #'id) #'then #'else)]))) >> >> >> >> (define-syntax when-bound >> >> (syntax-rules () >> >> [(_ (id) e* ...) >> >> (if-unbound (id) (begin) (begin e* ...))])) >> >> >> >> (define-syntax when-unbound >> >> (syntax-rules () >> >> [(_ (id) e* ...) >> >> (if-unbound (id) (begin e* ...) (begin))])) >> >> >> >> (when-bound (let) >> >> (display "let is bound\n")) >> >> >> >> (when-bound (foo) >> >> cannot happen) >> >> >> >> (define-syntax q1 >> >> (syntax-rules () >> >> [(_) >> >> (begin >> >> (define q1* 12) >> >> (when-bound (q1*) (display "q1 is bound\n")))])) >> >> (q1) >> >> >> >> (when-bound (q1*) (display "q1* is bound\n")) >> >> >> >> (define-syntax q2 >> >> (syntax-rules () >> >> [(_ q2) >> >> (begin >> >> (define q2 12) >> >> (when-bound (q2) (display 'q2) (display " is bound\n")))])) >> >> >> >> (q2 quux) >> >> >> >> (define-syntax q3 >> >> (syntax-rules () >> >> [(_ q3 q4) >> >> (begin >> >> (define q3 12) >> >> (when-bound (q4) (display 'q4) (display " is bound\n")))])) >> >> >> >> (q3 quux1 quux1) >> >> (q3 quux2 quux3) >> >> >> >> (define a.cons 12) >> >> (when-bound (a.cons) (display "a.cons bound\n")) >> >> (when-bound (cons) (display "cons bound\n")) >> >> >> >> >> >> $ IKARUS_LIBRARY_PATH='.' ikarus --r6rs-script t.ss >> >> let is bound >> >> q1 is bound >> >> quux is bound >> >> quux1 is bound >> >> a.cons bound >> >> cons bound >> >> >> >> $ plt-r6rs ++path . t.ss >> >> let is bound >> >> q1 is bound >> >> quux is bound >> >> quux1 is bound >> >> a.cons bound >> >> cons bound >> >> >> >> $ larceny -path . -r6rs -program t.ss >> >> let is bound >> >> q1 is bound >> >> quux is bound >> >> quux1 is bound >> >> a.cons bound >> >> cons bound >> >> >> >> $ ypsilon --sitelib=. --r6rs t.ss >> >> let is bound >> >> q1 is bound >> >> quux is bound >> >> quux1 is bound >> >> a.cons bound >> >> >> >> >> >> >> >> >> > > > > > -- > http://codeplex.com/IronScheme > http://xacc.wordpress.com >