<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.6000.16414" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV>If you are interested in module top level bindings only, you'll have 
to:</DIV>
<DIV>&nbsp;</DIV>
<DIV>0: keep record of module top level variables (e.g. in a hash table)</DIV>
<DIV>1: Redefine syntax define such as to recognize whether or not it is a 
module top level define by means of procedure syntax-local-context. If it does 
not return a top level, expand to normal define. If the define form is at top 
level, consult the record of variables and act accordingly.</DIV>
<DIV>2: You also may want to redefine define-values in this way.</DIV>
<DIV>3: The above should be done in a separate module defining a complete 
language (i.e. all of mzscheme except the define forms, which can be exported by 
(provide (rename ...))</DIV>
<DIV>4: Use the language as in (module module-name my-mzscheme-module 
language)</DIV>
<DIV>&nbsp;</DIV>
<DIV>Example:</DIV>
<DIV>&nbsp;</DIV>
<DIV>(module my-mzscheme-module-language mzscheme<BR>&nbsp;(require (only&nbsp; 
(lib "etc.ss") namespace-defined?))<BR>&nbsp;(define-for-syntax top-var-hash 
(make-hash-table))</DIV>
<DIV>&nbsp;</DIV>
<DIV>&nbsp;(define-syntax (my-define stx)<BR>&nbsp; (syntax-case stx 
()<BR>&nbsp;&nbsp; ((my-define (name . args) . body) #'(my-define name (lambda 
args . body)))<BR>&nbsp;&nbsp; ((my-define var value)<BR>&nbsp;&nbsp;&nbsp; 
(if</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp; (let&nbsp;((binding-type 
(identifier-binding&nbsp;#'var)))</DIV>
<DIV>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(and binding-type&nbsp; (not (eq? 
binding-type 'lexical))))<BR>&nbsp;&nbsp; #'(define var 
value))<BR>&nbsp;&nbsp;&nbsp;&nbsp; (let ((var-name (syntax-object-&gt;datum 
#'var)))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (hash-table-get top-var-hash 
var-name (lambda () #f))<BR>&nbsp;&nbsp;&nbsp;&nbsp; #'(set! var 
value)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (begin (hash-table-put! 
top-var-hash var-name #t)&nbsp; #'(define var 
value)))))))<BR>&nbsp;<BR>&nbsp;(provide (all-from-except mzscheme define) 
(rename my-define define)))</DIV>
<DIV>&nbsp;</DIV>
<DIV>(module use-my-mzscheme-module-language 
my-mzscheme-module-language<BR>&nbsp;(define a 1)<BR>&nbsp;(define a 
2)<BR>&nbsp;(define (b x) (define y (add1 x)) y)<BR>&nbsp;(provide a b))</DIV>
<DIV>&nbsp;</DIV>
<DIV>(module use mzscheme<BR>&nbsp;(require 
use-my-mzscheme-module-language)<BR>&nbsp;(printf "~a~n" a)<BR>&nbsp;(printf 
"~a~n" (b 2)))</DIV>
<DIV>&nbsp;</DIV>
<DIV>(require use) ; prints: 2&nbsp;newline 3 newline<BR></DIV>
<DIV>&nbsp;</DIV>
<DIV>(((((lambda(x)((((((((x x)x)x)x)x)x)x)x))<BR>&nbsp;&nbsp;&nbsp; 
(lambda(x)(lambda(y)(x(x y)))))<BR>&nbsp;&nbsp; (lambda(x)(x)x))<BR>&nbsp; 
(lambda()(printf "Greetings, Jos~n"))))</DIV>
<BLOCKQUOTE 
style="PADDING-RIGHT: 0px; PADDING-LEFT: 5px; MARGIN-LEFT: 5px; BORDER-LEFT: #000000 2px solid; MARGIN-RIGHT: 0px">
  <DIV style="FONT: 10pt arial">----- Original Message ----- </DIV>
  <DIV 
  style="BACKGROUND: #e4e4e4; FONT: 10pt arial; font-color: black"><B>From:</B> 
  <A title=yinso.chen@gmail.com href="mailto:yinso.chen@gmail.com">Yin-So 
  Chen</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>To:</B> <A title=jos.koot@telefonica.net 
  href="mailto:jos.koot@telefonica.net">jos koot</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>Cc:</B> <A title=plt-scheme@list.cs.brown.edu 
  href="mailto:plt-scheme@list.cs.brown.edu">mzscheme Mailing List</A> </DIV>
  <DIV style="FONT: 10pt arial"><B>Sent:</B> Sunday, April 22, 2007 12:32 
  PM</DIV>
  <DIV style="FONT: 10pt arial"><B>Subject:</B> Re: [plt-scheme] verifying 
  whether a symbol is defined at compile time?</DIV>
  <DIV><BR></DIV>Hi Jos - <BR><BR>Thanks for the quick response and the helpful 
  answer (the references/example are great).&nbsp; My motivation for having a 
  conditional define is to make it play nice with the module system, which 
  doesn't work well when having multiple definitions with the same name.&nbsp; I 
  was hoping there is an "automated" way of detecting whether a symbol is 
  already defined in the current module, if so, either override or not import 
  the definition.&nbsp; <BR><BR>Of course this is probably circumventing 
  module's design (seems that module is *a lot* stricter than REPL by design), 
  but I am certainly curious on how this could be done.&nbsp; Seems like that 
  compiler would have to keep symbol table(s) internally for all of the defined 
  symbols in order to throw the "already defined" error... ;) <BR><BR>Thanks, 
  <BR>yinso <BR><BR><BR>
  <DIV><SPAN class=gmail_quote>On 4/22/07, <B class=gmail_sendername>jos 
  koot</B> &lt;<A 
  href="mailto:jos.koot@telefonica.net">jos.koot@telefonica.net</A>&gt; 
  wrote:</SPAN>
  <BLOCKQUOTE class=gmail_quote 
  style="PADDING-LEFT: 1ex; MARGIN: 0pt 0pt 0pt 0.8ex; BORDER-LEFT: rgb(204,204,204) 1px solid">
    <DIV bgcolor="#ffffff">
    <DIV>Oops, the contra-example should read:</DIV>
    <DIV dir=ltr>&nbsp;</DIV>
    <DIV dir=ltr>(require (lib "etc.ss"))</DIV>
    <DIV>&nbsp;</DIV>
    <DIV dir=ltr><SPAN class=q>(define-syntax my-define<BR>&nbsp;(syntax-rules 
    ()<BR>&nbsp; ((my-define (name . args) . body) (my-define name (lambda args 
    . body)))<BR>&nbsp; ((my-define var value)<BR></SPAN>&nbsp;&nbsp; (define 
    var ; &lt;== correction<SPAN class=q><BR>&nbsp;&nbsp;&nbsp; 
    (begin<BR>&nbsp;&nbsp;&nbsp;&nbsp; (printf "my-define ~a status is ~s~n" 
    'var<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (if (namespace-defined? 'var) 
    'defined 'undefined))<BR>&nbsp;&nbsp;&nbsp;&nbsp; 
    value)))))</SPAN></DIV><SPAN class=q>
    <DIV>&nbsp;</DIV>
    <DIV dir=ltr>(if (read) (namespace-set-variable-value! 'b 2))<BR>(my-define 
    b 2)</DIV>
    <DIV dir=ltr></DIV>
    <DIV dir=ltr>&nbsp;</DIV>
    <DIV dir=ltr>Jos Koot</DIV></SPAN></DIV></BLOCKQUOTE></DIV><BR><BR 
  clear=all><BR>-- <BR><A 
  href="http://www.yinsochen.com">http://www.yinsochen.com</A><BR>...continuous 
  learning... </BLOCKQUOTE></BODY></HTML>