[Gd-hackers] Gwydion Dylan macro parsing error
Dustin Voss
d_j_v at mac.com
Fri Feb 15 04:06:20 CET 2008
Gwydion Dylan seems to have a bug in its macro processing, which I've
logged as #7369. The problem is that final semicolons can't be omitted
from a defining macro call. The bug includes a brief sample to
demonstrate the problem, and Open Dylan doesn't have a problem.
I think I've fixed it, but I wanted to run it past the group before
checking it in. The code had special logic for semicolon-separated
fragment matching vs. comma-separated fragment matching, and there may
have been a reason for that which I'm unaware of.
Anyway, since the comma-separated fragment matching code works as I
expect from reading the DRM (p. 151-152, http://www.opendylan.org/books/drm/Patterns)
, my proposed fix simply applies the same logic to both the semicolon-
and comma-separated cases.
Here is the diff:
Index: d2c/compiler/parser/support.dylan
===================================================================
--- d2c/compiler/parser/support.dylan (revision 11673)
+++ d2c/compiler/parser/support.dylan (working copy)
@@ -425,33 +425,15 @@
define generic remove-optional-semi-and-end (pattern :: <pattern>)
=> (new-pattern :: <pattern>, found-end? :: <boolean>);
-define method remove-optional-semi-and-end (pattern :: <semicolon-
pattern>)
+define method remove-optional-semi-and-end
+ (pattern :: type-union(<semicolon-pattern>, <comma-pattern>))
=> (new-pattern :: <pattern>, found-end? :: <boolean>);
- let right = pattern.pattern-right;
- if (instance?(right, <name-pattern>)
- & right.pattern-name.token-symbol == #"end")
- values(pattern.pattern-left, #t);
- else
- let (new-right, found-end?) = remove-optional-semi-and-end(right);
- if (found-end?)
- values(make(<semicolon-pattern>,
- left: pattern.pattern-left,
- right: new-right,
- last: ~instance?(new-right, <semicolon-pattern>)),
- #t);
- else
- values(pattern, #f);
- end if;
- end if;
-end method remove-optional-semi-and-end;
-
-define method remove-optional-semi-and-end (pattern :: <comma-pattern>)
- => (new-pattern :: <pattern>, found-end? :: <boolean>);
let (new-right, found-end?)
= remove-optional-semi-and-end(pattern.pattern-right);
if (found-end?)
- values(make(<comma-pattern>, left: pattern.pattern-left, right:
new-right,
- last: ~instance?(new-right, <comma-pattern>)),
+ values(make(pattern.object-class, left: pattern.pattern-left,
+ right: new-right,
+ last: ~instance?(new-right, pattern.object-class)),
#t);
else
values(pattern, #f);
More information about the hackers
mailing list