I left off a "syntax": it should be (lambda (o) (syntax-case o () (_
#'(raise <>)))). And then Issue 1 disappears =)

But issue 2 is harder... it would be solved by ikarus's import form (i
could define the library name once and import it), assuming calling
import in a transformer makes the imports available at all phases. but
I don't see a way to avoid writing the library's name twice in
portable r6rs.

On Sun, Jun 14, 2009 at 10:26 PM, Ramana Kumar<ramana.ku...@gmail.com> wrote:
> Ah I think this variation on what I sent below will work!
> Instead of (identifier-syntax (raise <>)) I can use
> (lambda (o) (syntax-case o () (_ (raise <>))))
>
> There are two minor defects with this whole approach - do you know how
> they might be fixed?
> 1. I'm using make-who-condition instead of my own new condition type
> because constructing a condition defined in the test script would be
> an out of context error... but it would be better to use a custom
> condition so I don't accidentally skip a legitimate who condition.
> 2. I have to write the (library-being-tested) name twice - once in the
> import line of the script and once in the call to environment in
> define-missing-exports. Can I have it in only one place?
>
> On Sun, Jun 14, 2009 at 9:50 PM, Ramana Kumar<ramana.ku...@gmail.com> wrote:
>> I thought this code would do what you say is impossible (I do believe
>> you, though =P). The problem it runs into is that the call to raise
>> (produced by the identifier-syntax) isn't necessarily evaluated first
>> in an offending expression. (And if you raise the exception in the
>> transformer rather than creating an identifier-syntax, it doesn't get
>> caught by the with-exception-handler in test.) There may be bigger
>> problems with it, though - if you feel like educating, let me know if
>> you see any.
>>
>> (define-syntax define-missing-exports
>>  (lambda (o)
>>    (syntax-case o ()
>>      ((_ var ...)
>>       #`(begin .
>>           #,(let rec ((ls #'(var ...)))
>>               (cond
>>                 ((null? ls) '())
>>                 ((call/cc
>>                    (lambda (k)
>>                      (with-exception-handler
>>                        (lambda (x) (k (not (undefined-violation? x))))
>>                        (lambda () (eval (syntax->datum (car ls))
>> (environment '(library-being-tested)))))))
>>                  (rec (cdr ls)))
>>                 (else
>>                   `(,#`(define-syntax #,(car ls)
>>                          (identifier-syntax (raise
>> (make-who-condition '#,(car ls)))))
>>                     . ,(rec (cdr ls)))))))))))
>>
>> (define-missing-exports set of all possible exports from the library
>> being tested)
>>
>> (define-syntax test
>>  (syntax-rules ()
>>    ((_ expr)
>>     (call/cc
>>       (lambda (k)
>>         (with-exception-handler
>>           (lambda (x)
>>             (if (who-condition? x)
>>               (begin
>>                 (display (string-append "missing export: "
>> (symbol->string (condition-who x))))
>>                 (newline)
>>                 (k))
>>               (raise-continuable x)))
>>           (lambda () expr)))))))
>>
>>
>> On Sun, Jun 14, 2009 at 9:25 PM, Abdulaziz Ghuloum<aghul...@gmail.com> wrote:
>>>
>>> On Jun 14, 2009, at 2:10 PM, Ramana Kumar wrote:
>>>
>>>>> So, you have a library that may or may not export a macro, say let^,
>>>>> and you have an expression that may or may not reference let^.  If
>>>>> the expression references let^, and let^ was not exported, which
>>>>> would normally result in a syntax error, you want to defer the error
>>>>> until run time instead of being signaled at macro-expansion time.
>>>>
>>>> I actually don't want the error at all - I want to detect that let^ is
>>>> not exported and therefore remove the expression that references it
>>>> (or replace it with something). This can happen at macro expansion
>>>> time. Still not possible?
>>>
>>> It's the same thing.  You want to handle the syntax-error exception by
>>> replacing the offending expression with another one of your choice.
>>> The replacement may be just #f or (asserion-violation 'foo "unbound")
>>> or whatever.  Still, not possible to do correctly without hacking on
>>> psyntax.
>>>
>>> Aziz,,,
>>>
>>>
>>
>

Reply via email to