Is this what you meant?
It doesn’t work, and it also draws a pink arrow (that I don’t want) from the x
in (ref x) to the beginning of the let expression in the definition of ref,
and also, if I put a let around the (ref x), it also draws another pink arrow
(that I don’t want) from the beginning of the let expression in the definition
of ref to the beginning of the let expression around (ref x).
#lang racket
(begin-for-syntax
(define vars (make-hash))
)
(define-syntax (bind stx)
(syntax-case stx ()
[(bind id)
(let ([sym (syntax-e #'id)])
(hash-set! vars sym #'id)
#'(void))]))
(define-syntax (ref stx)
(syntax-case stx ()
[(ref id)
(let* ([sym (syntax-e #'id)]
[def-id-stx (hash-ref vars sym)])
(with-syntax ([def-id (datum->syntax def-id-stx sym def-id-stx)]
[ref-id (datum->syntax def-id-stx sym #'id)])
#'(let ([def-id (void)])
ref-id)))]))
(bind x)
(ref x)
Any suggestions?
Anything I’m doing wrong?
On May 26, 2014, at 12:05 AM, Robby Findler <[email protected]> wrote:
> Oh, check syntax just collects the identifiers it finds in the
> properties and, if the identifiers are free-identifier=? to each
> other, draws an arrow. I'm not sure what behavior you want here, but
> maybe the best thing is if you just expand into some dead code that
> has lets in the way that you want the arrows to be.
>
> Robby
>
> On Sun, May 25, 2014 at 9:49 PM, Alexander D. Knauth
> <[email protected]> wrote:
>> It’s working, but I have no Idea how to show lexical scoping
>>
>> If I have this:
>> (bind x)
>> (ref x)
>> It works like I want it to work.
>>
>> Also for some reason this works:
>> (let ()
>> (bind x)
>> (void))
>> (ref x)
>> Which is good I guess in some ways, but still weird.
>> It’s good because it gives me a chance to define my own lexical scoping
>> rules, but how do I do that?
>>
>> I think it has something to do with the 2 xs having the same syntax-marks,
>> but I’m not sure.
>>
>> The problem is that I can’t make them have different syntax-marks. To do
>> this I think I would have to use (make-syntax-introducer) instead of
>> syntax-local-introduce, but for some reason that’s not working.
>>
>> If I change the definition of stx-introducer from syntax-local-introduce to
>> (make-syntax-introducer), then it doesn’t work. I don’t really know what
>> I’m doing here, but I think that If I want to have different references in
>> different scopes point to only their own respective definitions (lexical
>> scoping), then I think I would have to use (make-syntax-introducer) instead
>> of syntax-local-introduce. But that’s not working, so then how do I do that?
>>
>> #lang racket
>>
>> (begin-for-syntax
>> (define stx-introducer syntax-local-introduce)
>> ;; (define stx-introducer (make-syntax-introducer))
>> )
>>
>> (define-syntax (bind stx)
>> (syntax-case stx ()
>> [(bind-1 id)
>> (let ([new-id (stx-introducer #'id)] [id.length (string-length
>> (symbol->string (syntax-e #'id)))])
>> (syntax-property #`(void)
>> 'sub-range-binders
>> (list (vector new-id 0 id.length new-id 0
>> id.length))))]))
>>
>> (define-syntax (ref stx)
>> (syntax-case stx ()
>> [(ref-1 id)
>> (syntax-property #'(void)
>> 'disappeared-use
>> (list (stx-introducer #'id)))]))
>>
>> (let ()
>> (bind x)
>> (void))
>> (ref x)
>>
>> On May 25, 2014, at 6:00 PM, Robby Findler <[email protected]>
>> wrote:
>>
>>> Yes. One approach is to expand into a program that never runs but that
>>> has the identifiers in the binding relationships you want check syntax
>>> to show. Another approach is to add properties to your program that
>>> tells check syntax what to draw. You can read about the second
>>> approach here:
>>>
>>> http://docs.racket-lang.org/tools/Check_Syntax.html?q=check%20syntax#%28part._.Syntax_.Properties_that_.Check_.Syntax_.Looks_.For%29
>>>
>>> Let us know if you get stuck when you try it!
>>>
>>> Robby
>>>
>>> On Sun, May 25, 2014 at 2:41 PM, Alexander D. Knauth
>>> <[email protected]> wrote:
>>>> Is there any way to use syntax properties or anything like that to tell
>>>> DrRacket where to draw the arrows to?
>>>>
>>>> I’m trying to make my own language and I wanted to be able to have
>>>> DrRacket draw the arrows.
>>>>
>>>> Also is there a way to have it draw multiple arrows, so that for example
>>>> it would draw arrows not only to the original definition but also to all
>>>> of the expressions that set! it?
>>>>
>>>>
>>>> ____________________
>>>> Racket Users list:
>>>> http://lists.racket-lang.org/users
>>
____________________
Racket Users list:
http://lists.racket-lang.org/users