<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"><head><meta http-equiv=Content-Type content="text/html; charset=us-ascii"><meta name=Generator content="Microsoft Word 15 (filtered medium)"><style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}
a:visited, span.MsoHyperlinkFollowed
        {mso-style-priority:99;
        color:#954F72;
        text-decoration:underline;}
p.MsoPlainText, li.MsoPlainText, div.MsoPlainText
        {mso-style-priority:99;
        mso-style-link:"Plain Text Char";
        margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
span.PlainTextChar
        {mso-style-name:"Plain Text Char";
        mso-style-priority:99;
        mso-style-link:"Plain Text";
        font-family:"Calibri",sans-serif;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]--></head><body lang=EN-US link="#0563C1" vlink="#954F72"><div class=WordSection1><p class=MsoNormal>Hello,<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I’m working on a macro that will have mutable state. <o:p></o:p></p><p class=MsoNormal>[I’m new to macros in general, and I’m new to pattern matching in Racket and all things related to syntax functions and objects.  I’m also still learning about macro expansion, compile time, run time, etc.]<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>I was surprised that the macro’s state is empty when I try to interact with it from the Interactions Window.  Are all the compile/macro-expansion time definitions redefined for the Interactions Window?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>In the below Interactions Window dialogue, why does (acc) start referring to a different hashtable than ht2?<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Regards,<o:p></o:p></p><p class=MsoNormal>Paul<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoNormal>Here’s my stripped-down code:<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p><p class=MsoPlainText>#lang racket<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>(begin-for-syntax<o:p></o:p></p><p class=MsoPlainText>  (define ht (make-hash))<o:p></o:p></p><p class=MsoPlainText>  )<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>(define-syntax (acc stx)<o:p></o:p></p><p class=MsoPlainText>  (syntax-case stx ()<o:p></o:p></p><p class=MsoPlainText>    [(_ (f (fn x) body)) (begin<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>                           ; Record what was defined within the acc block<o:p></o:p></p><p class=MsoPlainText>                           (hash-set! ht<o:p></o:p></p><p class=MsoPlainText>                                      (syntax->datum (syntax fn))<o:p></o:p></p><p class=MsoPlainText>                                      (syntax->datum (syntax body)))<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>                           ; Define it in the real evironment<o:p></o:p></p><p class=MsoPlainText>                           #'(f (fn x) body))]<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>    [(_) (datum->syntax #'acc ht)] ; see what’s been recorded<o:p></o:p></p><p class=MsoPlainText>    ))<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>; Define a sqr function<o:p></o:p></p><p class=MsoPlainText>(acc<o:p></o:p></p><p class=MsoPlainText> (define (sqr2 x) (* x x))<o:p></o:p></p><p class=MsoPlainText> )<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>; Try the sqr function<o:p></o:p></p><p class=MsoPlainText>(sqr2 5)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>; See what was recorded by the macro<o:p></o:p></p><p class=MsoPlainText>(acc)<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>; Bind a run-time variable to the macro's hashtable<o:p></o:p></p><p class=MsoPlainText>(define ht2 (acc))<o:p></o:p></p><p class=MsoPlainText><o:p> </o:p></p><p class=MsoPlainText>--------Interactions Window dialogue<o:p></o:p></p><p class=MsoPlainText>25<o:p></o:p></p><p class=MsoPlainText>'#hash((sqr2 . (* x x)))<o:p></o:p></p><p class=MsoPlainText>> (sqr2 5)<o:p></o:p></p><p class=MsoPlainText>25<o:p></o:p></p><p class=MsoPlainText>> (acc) ;the hashtable is empty<o:p></o:p></p><p class=MsoPlainText>'#hash()<o:p></o:p></p><p class=MsoPlainText>> ht2 ;no, it’s not<o:p></o:p></p><p class=MsoPlainText>'#hash((sqr2 . (* x x)))<o:p></o:p></p><p class=MsoPlainText>> (acc (define (sqr3 x) (* x x)))<o:p></o:p></p><p class=MsoPlainText>> (acc)<o:p></o:p></p><p class=MsoPlainText>'#hash((sqr3 . (* x x)))<o:p></o:p></p><p class=MsoPlainText>> ht2<o:p></o:p></p><p class=MsoPlainText>'#hash((sqr2 . (* x x)))<o:p></o:p></p><p class=MsoNormal><o:p> </o:p></p></div></body></html>