This section 
http://www.r6rs.org/final/html/r6rs-lib/r6rs-lib-Z-H-1.html#node_toc_node_sec_12.7
begins by saying you can introduce a fixed number of identifiers by
simply naming them, but when you don't know how many identifiers you
will need you can use generate-temporaries. Now when you introduce
temporary identifiers by simply naming them, they pick up the context
of the transformer. So it seems there's an argument that
generate-temporaries should behave analogously... (which would break
Aziz's original definition of unbound?). What would be missing is a
way to get at an empty context. Is there any way to remove define and
syntax from the context of empty-ctxt in (library (foo) (export
empty-ctxt) (import (only (rnrs) define syntax)) (define empty-ctxt
(syntax here))) ?

On Fri, Jun 19, 2009 at 6:34 PM, Ramana Kumar<ramana.ku...@gmail.com> wrote:
> 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
>>
>

Reply via email to