I don't think expanding into a define and a define-for-syntax will work. If I understand Nick correctly then Arc doesn't have phases and state should be shared across the uses in macros and uses in the program. I.e.
(define cdr/only-once (let ((state #f)) (lambda (list) (if state list (begin (set! state #t) (cdr list)))))) Should only ever take the cdr once even across expansion/runtime. On Mon, Aug 5, 2013 at 10:12 AM, Vincent St-Amour <stamo...@ccs.neu.edu> wrote: > For that, you could have Arc's `define' expand into both a Racket > `define' and a `define-for-syntax', which I believe is what Jens was > suggesting. You may want to do something similar for `require', too. > > Vincent > > > > At Mon, 5 Aug 2013 10:06:36 -0700, > Nick Sivo wrote: >> >> I'm aware of defmacro and even understand its implementation (cute >> trick!), but I need to eventually get something like this to work: >> >> (require compatibility/defmacro) >> >> (define (my-cdr lst) >> (cdr lst)) >> >> (defmacro drop-first-form args >> `(begin ,@(my-cdr args))) >> >> (drop-first-form >> (displayln 1) >> (displayln 2)) >> >> Where the above just works and displays 2. >> >> I'll check out the latest research papers too. >> >> Thanks, >> Nick >> >> On Mon, Aug 5, 2013 at 1:40 AM, Noel Welsh <noelwe...@gmail.com> wrote: >> > Does defmacro do what you want? >> > >> > http://docs.racket-lang.org/compatibility/defmacro.html?q=defmacro#%28form._%28%28lib._compatibility%2Fdefmacro..rkt%29._defmacro%29%29 >> > >> > In terms of grokking the macro system you probably want to read some of the >> > research papers, which you can find from links here: >> > >> > http://racket-lang.org/people.html >> > >> > Racket's macro system is really cutting edge, so it doesn't have a large >> > body of text explaining it. >> > >> > HTH, >> > N. >> > >> > >> > >> > On Sun, Aug 4, 2013 at 9:50 PM, Nick Sivo <nicks...@gmail.com> wrote: >> >> >> >> Hello everyone, >> >> >> >> I work on Hacker News[1], which is written in Arc[2], and am tasked >> >> with making it faster. The Arc compiler targets Racket[3], but >> >> doesn't do so in such a way that function names or source locations >> >> are preserved. This makes output from the sampling profiler and error >> >> messages mostly useless. >> >> >> >> I'd like to make Arc work as a Racket language (and in the process >> >> preserve srclocs and names), and have made some progress[4]. However, >> >> I'm hitting a wall trying to implement Arc's macros. Specifically, I >> >> need to find a way for the macros themselves to use previously defined >> >> Arc functions as part of their processing. I understand that there are >> >> good reasons for Racket's hygiene and syntax phases, but I'm >> >> implementing an existing language that has its own strong opinions. >> >> I'm almost certain that accomplishing my goal is possible with the >> >> right understanding, but despite reading much of the Racket Reference, >> >> I don't truly get it yet. >> >> >> >> With that motivation in mind, what's the best way for me to become >> >> intimately familiar with Racket's runtime, execution and compilation >> >> model? Should I read through and make sure I understand the debugger? >> >> The macro stepper? Is there any kind of guide to Racket Internals? >> >> >> >> Thanks for any advice. >> >> >> >> Best, >> >> Nick >> >> >> >> [1] https://news.ycombinator.com >> >> [2] http://arclanguage.org >> >> [3] Well, really mzscheme >> >> [4] https://github.com/kogir/rark >> >> ____________________ >> >> Racket Users list: >> >> http://lists.racket-lang.org/users >> > >> > >> ____________________ >> Racket Users list: >> http://lists.racket-lang.org/users > ____________________ > Racket Users list: > http://lists.racket-lang.org/users ____________________ Racket Users list: http://lists.racket-lang.org/users