On 01/11/2011 09:08 AM, Eduardo Bellani wrote:
Hello list.

I am having a bit of a pain with trying to create a custom require
syntax. I am trying to save some typing in an MVC like application by
building some macros to recognize in the test files where the files to
be tested are.

I have 2 doubts I think, one is how to retrieve the module name for the
my-model-test macro and the other is how to make those macros work in
in the require form as the target-test.rkt file tries to do.

BTW, I have looked at the require Macros section of the docs, but so far
to no avail.

For illustration, here is my (broken) code:

;; auxiliary.rkt
#lang racket

(require rackunit
          racket/require-syntax
          rackunit/text-ui)

(provide (all-from-out rackunit)
          (all-from-out rackunit/text-ui)
          models-test
          my-model-test)

(define-syntax my-model-test
   (syntax-rules ()
     [(_)
      (string-append "../app/model/" *MODULE-NAME*)]))


(define-syntax models-test
   (syntax-rules ()
     [(_ model-name ...)
      (values (string-append "../app/model/" model-name) ...)]))




;;target-test.rkt
(require "../auxiliary.rkt"
          (model-test "a-model")
          (my-model-test))


Any ideas?

First, you need to use define-require-syntax:

  (define-require-syntax from-model ___)

Next, since you want to compute the new path at compile time, you can't use syntax-rules. If you do, then you'll return the string-append expression as if it were a require form; but it isn't, and you'll get an error.

  (define-require-syntax (from-model stx)
    (syntax-case stx ()
      [(from-model relpath)
       (string? (syntax-e #'relpath))  ;; only relative path, ie strings
       ___]))

Finally, you want to append the given string to a common prefix:

  (string-append "../app/model/" (syntax-e #'relpath))

But that's a string, and your require macro must return a syntax object. And since require is essentially a non-hygienic binding form that binds names based on the lexical context of the require subforms, you get the lexical context right. The right lexical context in this case is the same as the original require form, stx:

  (datum->syntax stx
                 (string-append "../app/model/" (syntax-e #'relpath)))

Then use it thus:

  (require (from-model "some-file.rkt")
           (from-model "another-file.rkt"))

Ryan
_________________________________________________
 For list-related administrative tasks:
 http://lists.racket-lang.org/listinfo/users

Reply via email to