Instead of creating hola-fields which exists at run-time, you can
(define-syntax
hola ...) to a struct containing the field information at compile-time (it
probably needs to contain other information too). The struct could have
prop:procedure which in this case will be the syntax transformer that
generates struct creation. Looking up the field compile-time information
then can be done by using syntax-local-value or static syntax class. See
section 2.1 in https://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf
for explanations.

What’s unclear to me are:

1) How would you deal with the following? Should it be an error?

(card (foo . xs))
(card foo (bar . ys))

2) How would you determine the number of fields (and field names) in the
following?

> (card (line . xs))
> (line 1 2 3 4 5 6 7 8 9)

Wouldn’t it make more sense to have:

> (card (line . xs))
> (line '(1 2 3 4 5 6 7 8 9))

where xs is the only field.

3) Shouldn’t the following result in (ciao 7 3)?

> (card (ciao a [b 3]))
> (ciao 7)



On Thu, Sep 16, 2021 at 2:12 PM Dimaugh Silvestris <
[email protected]> wrote:

> Sorry, I haven't posted the full macro because it's long and makes use of
> several other functions, but I'll try to summarize what it does:
>
> Short summary: I'm trying to have a macro (mymacro oldname newname (fields
> ...)) that accesses oldname-foo, which contains a list of symbols, and then
> define a function that takes (cons oldname-foo (fields ...)) formated as
> identifiers as arguments. Or at least to get the length of oldname-foo and
> name them whatever.
>
> Full explanation: using make-struct-type I'm building a different struct
> system I call cards, where structs can be defined as a function call, which
> will be their constructor, and they are printed as the constructor function
> call that would generate them. So, for instance, we can do:
> > (card (hola a b #:c c))
> > (hola 1 2 #:c 3)
> (hola 1 2 #:c 3)
> or
> > (card (ciao a [b 3]))
> > (ciao 7)
> (ciao 7)
> > (ciao 7 4)
> (ciao 7 4)
>
> or even
>
> > (card (line . xs))
> > (line 1 2 3 4 5 6 7 8 9)
> (line 1 2 3 4 5 6 7 8 9)
>
> Also the names of the fields are stored in *<name-of-the-card>-fields
> (this is the abc-foo of the above example), so *hola-fields contains '(a b
> #:c c).
> So far this is working perfectly, but I don't have inheritance. So when I
> create a card that inherits from a previous card, I need to access its
> *<parent-card>-fields to define a new function containing both the parent
> and the son fields. That is, I'm trying to get this behavior:
> > (card (hola a #:b b))
> > (card hola (ciao c))  ;;; should expand to (define (ciao a #:b b c)
> ...), among other things
> > (ciao 1 #:b 2 3)
> (ciao 1 #:b 2 3)
>
> On Thu, 16 Sept 2021 at 22:35, Sorawee Porncharoenwase <
> [email protected]> wrote:
>
>> In general, it would be helpful to provide an example of the macro use,
>> so that we know what you want to do. If it doesn't work, it would be
>> helpful to provide the buggy program and an error message so that we can
>> help with the issue that you are encountering.
>>
>> From my guess, you have a variable named abc-foo somewhere, and with
>> this macro, you wish to define a function named abc that can access the
>> value of abc-foo? If so, here’s an example of a working program:
>>
>> #lang racket
>>
>> (require (for-syntax racket/syntax))
>>
>> (define-syntax (my-macro stx)
>>   (syntax-case stx ()
>>     [(_ name other-args ...)
>>      (with-syntax ([varname (format-id #'name "~a-foo" #'name)])
>>        #'(define name
>>            (λ (other-args ...)
>>              (println (list varname other-args ...)))))]))
>>
>> (define abc-foo 123)
>> (my-macro abc x y)
>> (abc 5 6) ;=> '(123 5 6)
>>
>>
>>
>>
>>
>> On Thu, Sep 16, 2021 at 1:21 PM Dimaugh Silvestris <
>> [email protected]> wrote:
>>
>>> (sorry if I'm asking too many questions about macros lately, I'm
>>> learning about them but I keep running into scenarios I can't find
>>> documentation for)
>>>
>>> I'm trying to capture the value of a variable whose identifier I can
>>> only get with format-id, inside a with-syntax.
>>> Something like this pseudocode (imagine name-foo contains a list of
>>> symbols):
>>> (define-syntax (my-macro stx)
>>>   (syntax-case stx ()
>>>     ((_ name other-args ...)
>>>      (with-syntax* ((varname (format-id #'name "~a-foo" #'name))
>>>                     (varval (cons (datum->syntax #'varname)
>>> (datum->syntax #'(other-args ...)))))
>>>        #'(define name (λ varval (print varval)))))))
>>>
>>>
>>> Which of course doesn't work. I understand this might have to do with
>>> how macros work at an earlier phase than runtime, so is it impossible?
>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Racket Users" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/racket-users/CAN4YmRF%3Do3NsXOvK2fvUDeYL_jfA9r946%3D%3DguoGb_%3DKyS%3Dm%2Bxw%40mail.gmail.com
>>> <https://groups.google.com/d/msgid/racket-users/CAN4YmRF%3Do3NsXOvK2fvUDeYL_jfA9r946%3D%3DguoGb_%3DKyS%3Dm%2Bxw%40mail.gmail.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>

-- 
You received this message because you are subscribed to the Google Groups 
"Racket Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/racket-users/CADcuegvgnUpin2sMeg%3DPHRAN4gBRDx0HpUAuz8dM3aaZ8uAGvw%40mail.gmail.com.

Reply via email to