[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Block comments and `read-hash-extend'
From: |
Ludovic Courtès |
Subject: |
Block comments and `read-hash-extend' |
Date: |
Thu, 16 Jun 2005 11:37:57 +0200 |
User-agent: |
Gnus/5.1007 (Gnus v5.10.7) Emacs/21.4 (gnu/linux) |
Hi,
The patch below (1) fixes `#! ... !#' block comments and (2) allows to
override them with `read-hash-extend'.
(1) This example makes Guile 1.6 and the current Guile 1.7 hang (for
some reason which I did not track down):
guile> #! this is a comment !# (+ 2 2)
[wait forever]
Once the patch is applied:
guile> #! this is a comment !# (+ 2 2)
4
I guess block comments have not been widely used over the past
years. ;-)
(2) It makes it possible to discard the block comment syntax with
`read-hash-extend'. The example below allows to recognize the
DSSSL keyword syntax[*], at the expense of losing the block
comment syntax:
(read-hash-extend #\! (lambda (chr port)
(symbol->keyword (read port))))
I find this particular example useful since, even if DSSSL is
apparently not widely used, other Scheme implementations such as
Bigloo do support this syntax, and allowing such extensions is what
`read-hash-extend' is for.
Comments?
Thanks,
Ludovic.
[*] http://www.ibiblio.org/pub/sun-info/standards/dsssl/dssslo/do960816.htm
2005-06-16 Ludovic Courtès <address@hidden>
* read.c (scm_flush_ws): Do not handle `#! .. !#' block
comments here so that the behavior of `#!' can be extended with
`read-hash-extend'.
(scm_lreadr): Handle the `#!' case here instead of in
`scm_flush_ws ()' after making sure that no hash reader
extension exists for `!'. Jump to `tryagain' after call to
`skip_scsh_block_comment ()', which fixes a bug in block
comments handling (where Guile would hang).
Index: read.c
===================================================================
RCS file: /cvsroot/guile/guile/guile-core/libguile/read.c,v
retrieving revision 1.117
diff -u -B -b -p -r1.117 read.c
--- read.c 23 May 2005 19:57:21 -0000 1.117
+++ read.c 16 Jun 2005 09:13:28 -0000
@@ -227,9 +227,6 @@ scm_flush_ws (SCM port, const char *eofe
case EOF:
eoferr = "read_sharp";
goto goteof;
- case '!':
- skip_scsh_block_comment (port);
- break;
default:
scm_ungetc (c, port);
return '#';
@@ -478,9 +475,10 @@ scm_lreadr (SCM *tok_buf, SCM port, SCM
goto num;
case '!':
- /* should never happen, #!...!# block comments are skipped
- over in scm_flush_ws. */
- abort ();
+ /* Only handle `#! ... !#' block comments if no user extension was
+ defined for `!' using `read-hash-extend'. */
+ skip_scsh_block_comment (port);
+ goto tryagain;
case '*':
j = scm_read_token (c, tok_buf, port, 0);
- Block comments and `read-hash-extend',
Ludovic Courtès <=