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
includereads from the specified file with
readwithout any syntax information. So, in above case it shouldn't refer the
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
(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-casemust 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
readand 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...