If you have a fairly recent version of Racket, you can use *submodules*.

Here's library.rkt:

  #lang racket/base
  (require (for-syntax racket/base))

  ;; An auxiliary submodule for the parts to be used at
  ;; multiple phases:
  (module helper racket/base
    (require (for-template racket/base))
    (define (my-syntax-util stx)
      (quasisyntax/loc stx
        (cons 'my-syntax-util-was-here #,stx)))
    (provide my-syntax-util))

  ;; Require the submodule at the two different phases:
  (require (submod "." helper)
           (for-syntax (submod "." helper)))

  (define-syntax (my-own-syntax stx)
    (syntax-case stx ()
      ((_ CONDITION VAL)
       (quasisyntax/loc stx
         (if CONDITION
             #,(my-syntax-util (syntax VAL))
             VAL)))))

  (provide my-own-syntax
           my-syntax-util)

Ryan


On 03/20/2012 11:08 AM, Neil Van Dyke wrote:
In the below example, can file "library.rkt" be changed (without
splitting it up into two files), so that file "program.rkt" works
without change? Is using "racket/load" the only way to keep
"library.rkt" to one file like this?


;;;; FILE library.rkt
#lang racket/base

(require (for-syntax racket/base))

(define-for-syntax (my-syntax-util stx)
;; Pretend that "my-syntax-util" performs some big complicated processing,
;; which is useful both in the implementation of "my-own-syntax" and
;; also directly by users of this library.
(quasisyntax/loc stx
(cons 'my-syntax-util-was-here #,stx)))

(define-syntax (my-own-syntax stx)
(syntax-case stx ()
((_ CONDITION VAL)
(quasisyntax/loc stx
(if CONDITION
#,(my-syntax-util (syntax VAL))
VAL)))))

(provide my-own-syntax
my-syntax-util)


;;;; FILE program.rkt
#lang racket/base

(require "library.rkt")

(my-own-syntax (equal? "a" "a") 42)

(my-syntax-util #'id)


____________________
 Racket Users list:
 http://lists.racket-lang.org/users

Reply via email to