Then R7RS draft 9 says like this;Dybvig's paper about syntax-case, I'm unsure abouttherequirements of R7RS regarding the use of `include' within macros: (define-syntax m (syntax-rules () ((_) (lambda (a) (include "some/file.sch"))))) where the file "some/file.sch" contains, say, (+ a 1) Is the symbol `a' in "some/file.sch" supposed to match the lambda's argument?[Scheme-reports] file inclusion (section 4.1.7 of draft 9)
Both include and include-ci take one or more names expressed as string literals, apply an implementation-specifi c algorithm to find corresponding files, read the contents of the files in the specified order as if by repeated applications of read, and e ffectively replace the include or include-ci expression with a begin expression containing what was read from the files.So in R7RS
include
reads from the specified file with read
without any syntax information. So, in above case it shouldn't refer the lambda
's argument.Now, John Cowan responded a lot of implementation could see the variable a. Well, yes, this is odd. However I think I know why (only R6RS implementation wise).
Following is the (naive) implementation of the
include
with R6RS syntax-case
(import (rnrs)) (define-syntax include (lambda (x) (define (do-include k name) (call-with-input-file name (lambda (in) (do ((e (read in) (read in)) (r '() (cons (datum->syntax k e) r))) ((eof-object? e) (reverse r)))))) (syntax-case x () ((k name) (string? (syntax->datum #'name)) (with-syntax (((expr ...) (do-include #'k (syntax->datum #'name)))) #'(begin expr ...))))))The point in R6RS is that
syntax-case
must always return syntax object so with this implementation, the included expressions wrapped (or converted) by syntax object so that a contains some syntactic information to refer the lambda
's argument. (Unfortunately, Sagittarius raises an error with unbound variable. Well, I know it's a bug...)Then we need to come back to what R7RS says. Yes, it actually doesn't specify but read the file content by
read
and replace it. Thus, both behaviours can be valid as my understanding.Now, my big problem is that I need to fix the macro's bug... I thought it could see it but it didn't...
No comments:
Post a Comment