You might have already read it, but I also found the guide "Fear of
Macros" by Greg Hendershott incredibly helpful in understanding them,
especially considering things like with-syntax and format-id:
http://www.greghendershott.com/fear-of-macros/index.html
On 03.05.13 04:57, Sean McBeth wrote:
I think I get it just from reading it (in bed, on the phone, annoying
the wife). I had tried to do almost this very thing with datum->syntax
at one point, but I had put the quotesyntax on datum->syntax, not on
id directly. I don't understand why that would make a difference, it
seems like it is similar to doing (list 'a 'b) instead of '(a b)...
oh, nope, now I get it. It specifically *is* similar, except my second
example should have been '(list a b).
On May 2, 2013 10:38 PM, "Sean McBeth" <sean.mcb...@gmail.com
<mailto:sean.mcb...@gmail.com>> wrote:
Aaah, man. Thanks. Shutdown the pc for the night so u will try
tomorrow.
On May 2, 2013 10:35 PM, "Jay McCarthy" <jay.mccar...@gmail.com
<mailto:jay.mccar...@gmail.com>> wrote:
You were close to what you want. Here's a version with a nice
utility
and then the underlying machinery that makes it:
#lang racket
(require (for-syntax racket/syntax))
(define-syntax (double-define stx)
(syntax-case stx (double-define)
[(_ id val1 val2)
(with-syntax ([id-1 (format-id #'id "~a-1" #'id)]
[id-2 (datum->syntax
#'id
(string->symbol
(format "~a-2"
(syntax->datum
#'id))))])
#'(begin (define id-1 val1)
(define id-2 val2)))]))
(double-define id 3 7)
(displayln id-1)
(displayln id-2)
On Thu, May 2, 2013 at 8:29 PM, Sean McBeth
<sean.mcb...@gmail.com <mailto:sean.mcb...@gmail.com>> wrote:
> Hi there!
>
> I'm pretty new to Racket, though not the basic concepts of
functional
> programming [1] Maybe I don't need macros here at all, but
it seemed like
> the right sort of lever when I first started, but now I'm
pretty stuck[2]
> and I don't understand enough about the macro system yet to
be able to
> figure this out.
>
> Basically, I'm trying to make a database migration tool +
relational mapper.
> I'd like to be able to define my tables in an abbreviated
Racket syntax and
> use the definition to generate everything from the
create-table SQL scripts,
> a few, basic CRUD-scripts-for-all-columns to structs that
will mirror a full
> table row when processing the query results.
>
> Right now, the table definition looks like this:
>
> (define-table tickets get-all-tickets
> ([ticket_id serial primary-key]
> [priority int nullable] ;; I believe in making not-null
the default case
> [description (varchar max)]
> [finished_on datetime (default "9999-12-31 23:59:59.999")])
>
> And this is pretty easy to parse into some "table" structs
that describe
> everything fairly sufficiently[3]:
> https://gist.github.com/capnmidnight/5506674
>
> Now, my sticking point is that I don't want to have
explicitly define that
> "get-all-tickets" identifier. I notice that, in my creating
the "column"
> struct, I've received a number of procedures for the
constructor and field
> accessors, all given a prefix of "column" for their
identifier. So at first
> glance, it seems like there are forms like struct that are
capable of
> dynamically defining identifiers.
>
> So, I stepped into the definition for struct and tried to
make sense of it,
> but the best I could figure out was that struct used
syntax-case instead of
> syntax-rules. It was a bit of a hair-ball for me, I couldn't
suss out the
> cross references, and at least at this late of an hour I'm
having trouble
> understanding the documentation on syntax-case.
>
> Specifically, I tried to do something like:
>
> (define-syntax (double-define stx)
> (syntax-case stx (double-define)
> [(_ id val1 val2)
> #`(begin (define id-1 val1)
> (define id-2 val2))]))
>
> (double-define id 3 7)
> (displayln id-1) ;; error "id-1 unbound identifier"
> (displayln id-2)
>
> I then tried something like:
>
> (define-syntax (double-define stx)
> (syntax-case stx (double-define)
> [(_ id val1 val2)
> (with-syntax ([id-1 #'(string->symbol (format "~a-1"
id))] ;; error
> "define: not an identifier, identifier with default, or
keyword for
> procedure argument"
> [id-2 #'(string->symbol (format "~a-2" id))])
> #'(begin (define id-1 val1)
> (define id-2 val2)))]))
>
> (double-define id 3 7)
> (displayln id-1)
> (displayln id-2)
>
> Clearly, not correct.
>
> I could make the table struct into a table class and then
just define a
> get-all method that does what I want, but that kind of feels
like giving up
> and I'm more interested in using this to learn more about
using macros, as
> it has already done for me.
>
>
>
> [1] Functional C# is something of a job safety program of
mine :P
>
> [2] i.e. been banging my head against the desk for the last
6 hours. I have
> gotten pretty comfortable with syntax-rules though, so it
wasn't a complete
> waste.
>
> [3] This isn't the final form, but I'm just pushing some
code around to try
> to get the basic concepts working. For example, the
get-all-tickets
> procedure wouldn't just return the query, it'd eventually
execute it and
> return the results.
>
> ____________________
> Racket Users list:
> http://lists.racket-lang.org/users
>
--
Jay McCarthy <j...@cs.byu.edu <mailto:j...@cs.byu.edu>>
Assistant Professor / Brigham Young University
http://faculty.cs.byu.edu/~jay <http://faculty.cs.byu.edu/%7Ejay>
"The glory of God is Intelligence" - D&C 93
____________________
Racket Users list:
http://lists.racket-lang.org/users
____________________
Racket Users list:
http://lists.racket-lang.org/users