This site is a static rendering of the Trac instance that was used by R7RS-WG1 for its work on R7RS-small (PDF), which was ratified in 2013. For more information, see Home.
Source for ticket #83
cc
changetime
2012-10-05 06:29:45
component
WG1 - Core
description
R6RS and R5RS have different behaviors for auxiliary keywords. Do we use symbolic keywords as in R5RS or do we use auxiliary keywords identifiers and implicit keywords as in R6RS?
Syntaxes like COND and CASE
have what are called auxiliary keywords, or auxiliary syntax. TSPL4 calles
them keywords, R6RS calls them a combination of literal identifiers and
auxiliary syntax depending on what the context of the discussion is. In
terms of SYNTAX-RULES, the form has something like this syntax:
(syntax-rules (<literal> ...) <clause> <clause> ...)
Now, in the above, the literals are auxiliary syntax keywords. The rules
for matching literals in a SYNTAX pattern are as follows, quoted from
the R6RS document:
A literal identifier matches an input subform if and only if the
input subform is an identifier and either both its occurrence in
the input expression and its occurrence in the list of literals
have the same lexical binding, or the two identifiers have the
same name and both have no lexical binding.
Now, the TSPL4 has some more to say about this:
Literals serve as auxiliary keywords, such as else in case and
cond expressions.
[...]
An input form F matches a pattern P if and only if [...] P is a
literal identifier and F is an identifier with the same binding
as determined by the predicate free-identifier=?.
This is further described in Section 8.3.
free-identifier=? is used to determine whether two identifiers
would be equivalent if they were to appear as free identifiers
in the output of a transformer. Because identifier references
are lexically scoped, this means (free-identifier=? id1 id2)
is true if and only if the identifiers id1 and id2 refer
to the same binding. (For this comparison, two like-named
identifiers are assumed to have the same binding if neither is
bound.) Literal identifiers (auxiliary keywords) appearing in
syntax-case patterns (such as else in case and cond) are matched
with free-identifier=?.
R6RS further goes on to export, explicitly, the auxilary keywords ELSE
and others. This gives some benefits which are actually quite nice in
some cases. What this permits is for you to have a number of additiona
bindings for that auxiliary keyword, and it also allows you to use
keywords internally that are not visible outside of a module or library
form. In general, I'm in favor of this form, having used it a bit.
What isn't as fortunate, or what some people don't like, is that it
makes the forms of COND and CASE, for example, sensitive to to their
lexical environments. So, something like this isn't going to work in
the way that some people expect:
(let ([else #f])
(cond [else 'a]))
This will actually evaluate to an unspecified value, because the else
there is not the same else as what COND expects. In something like R5RS,
this could have returned 'a.
One place where you can use this is if you want to use a different word
for else. You can name it to the Chinese word for else, if you so feel
like it.
The ticket is basically, do we use the lexical keywords, or symbolic
ones? My vote is for the lexical ones.
id
83
keywords
keyword,auxilary
milestone
owner
alexshinn
priority
major
reporter
arcfide
resolution
fixed
severity
status
closed
summary
Auxiliary Keywords
time
2010-10-16 00:12:57
type
task
Changes
Change at time 2012-10-05 06:29:45
author
cowan
field
comment
newvalue
oldvalue
6
raw-time
1349393385994109
ticket
83
time
2012-10-05 06:29:45
Change at time 2012-10-05 06:29:45
author
cowan
field
resolution
newvalue
fixed
oldvalue
raw-time
1349393385994109
ticket
83
time
2012-10-05 06:29:45
Change at time 2012-10-05 06:29:45
author
cowan
field
status
newvalue
closed
oldvalue
writing
raw-time
1349393385994109
ticket
83
time
2012-10-05 06:29:45
Change at time 2011-07-18 17:27:21
author
alexshinn
field
comment
newvalue
oldvalue
5
raw-time
1310984841000000
ticket
83
time
2011-07-18 17:27:21
Change at time 2011-07-18 17:27:21
author
alexshinn
field
status
newvalue
writing
oldvalue
decided
raw-time
1310984841000000
ticket
83
time
2011-07-18 17:27:21
Change at time 2011-07-10 18:28:58
author
alexshinn
field
comment
newvalue
We voted to make these bound.
oldvalue
4
raw-time
1310297338000000
ticket
83
time
2011-07-10 18:28:58
Change at time 2011-07-10 18:28:58
author
alexshinn
field
status
newvalue
decided
oldvalue
reopened
raw-time
1310297338000000
ticket
83
time
2011-07-10 18:28:58
Change at time 2011-05-19 15:40:52
author
alexshinn
field
comment
newvalue
Many new issues pertaining to this ticket have been
brought up on the public discussion list, so we are
re-opening.
oldvalue
3
raw-time
1305794452000000
ticket
83
time
2011-05-19 15:40:52
Change at time 2011-05-19 15:40:52
author
alexshinn
field
resolution
newvalue
oldvalue
fixed
raw-time
1305794452000000
ticket
83
time
2011-05-19 15:40:52
Change at time 2011-05-19 15:40:52
author
alexshinn
field
status
newvalue
reopened
oldvalue
closed
raw-time
1305794452000000
ticket
83
time
2011-05-19 15:40:52
Change at time 2011-01-24 06:51:29
author
cowan
field
comment
newvalue
WG1 voted to leave them unbound.
oldvalue
2
raw-time
1295823089000000
ticket
83
time
2011-01-24 06:51:29
Change at time 2011-01-24 06:51:29
author
cowan
field
resolution
newvalue
fixed
oldvalue
raw-time
1295823089000000
ticket
83
time
2011-01-24 06:51:29
Change at time 2011-01-24 06:51:29
author
cowan
field
status
newvalue
closed
oldvalue
new
raw-time
1295823089000000
ticket
83
time
2011-01-24 06:51:29
Change at time 2010-10-16 02:33:25
author
cowan
field
comment
newvalue
oldvalue
1
raw-time
1287171205000000
ticket
83
time
2010-10-16 02:33:25
Change at time 2010-10-16 02:33:25
author
cowan
field
summary
newvalue
Auxiliary Keywords
oldvalue
Auxilary Keywords
raw-time
1287171205000000
ticket
83
time
2010-10-16 02:33:25
Change at time 2010-10-16 02:33:25
author
cowan
field
description
newvalue
R6RS and R5RS have different behaviors for auxiliary keywords. Do we use symbolic keywords as in R5RS or do we use auxiliary keywords identifiers and implicit keywords as in R6RS?
Syntaxes like COND and CASE
have what are called auxiliary keywords, or auxiliary syntax. TSPL4 calles
them keywords, R6RS calls them a combination of literal identifiers and
auxiliary syntax depending on what the context of the discussion is. In
terms of SYNTAX-RULES, the form has something like this syntax:
(syntax-rules (<literal> ...) <clause> <clause> ...)
Now, in the above, the literals are auxiliary syntax keywords. The rules
for matching literals in a SYNTAX pattern are as follows, quoted from
the R6RS document:
A literal identifier matches an input subform if and only if the
input subform is an identifier and either both its occurrence in
the input expression and its occurrence in the list of literals
have the same lexical binding, or the two identifiers have the
same name and both have no lexical binding.
Now, the TSPL4 has some more to say about this:
Literals serve as auxiliary keywords, such as else in case and
cond expressions.
[...]
An input form F matches a pattern P if and only if [...] P is a
literal identifier and F is an identifier with the same binding
as determined by the predicate free-identifier=?.
This is further described in Section 8.3.
free-identifier=? is used to determine whether two identifiers
would be equivalent if they were to appear as free identifiers
in the output of a transformer. Because identifier references
are lexically scoped, this means (free-identifier=? id1 id2)
is true if and only if the identifiers id1 and id2 refer
to the same binding. (For this comparison, two like-named
identifiers are assumed to have the same binding if neither is
bound.) Literal identifiers (auxiliary keywords) appearing in
syntax-case patterns (such as else in case and cond) are matched
with free-identifier=?.
R6RS further goes on to export, explicitly, the auxilary keywords ELSE
and others. This gives some benefits which are actually quite nice in
some cases. What this permits is for you to have a number of additiona
bindings for that auxiliary keyword, and it also allows you to use
keywords internally that are not visible outside of a module or library
form. In general, I'm in favor of this form, having used it a bit.
What isn't as fortunate, or what some people don't like, is that it
makes the forms of COND and CASE, for example, sensitive to to their
lexical environments. So, something like this isn't going to work in
the way that some people expect:
(let ([else #f])
(cond [else 'a]))
This will actually evaluate to an unspecified value, because the else
there is not the same else as what COND expects. In something like R5RS,
this could have returned 'a.
One place where you can use this is if you want to use a different word
for else. You can name it to the Chinese word for else, if you so feel
like it.
The ticket is basically, do we use the lexical keywords, or symbolic
ones? My vote is for the lexical ones.
oldvalue
R6RS and R5RS have different behaviors for auxilary keywords. Do we use symbolic keywords as in R5RS or do we use auxiliary keywords identifiers and implicit keywords as in R6RS?
raw-time
1287171205000000
ticket
83
time
2010-10-16 02:33:25