Here are some of my latest (failed) experiments:

#lang racket

(require (for-syntax racket/struct-info))
(require racket/pretty)

(struct foo (a b) #:transparent)

(displayln `("a foo object is transparent: I can see inside: \n  
(struct->vector (foo 1 2)) ~~> "
             ,(struct->vector (foo 1 2))))

(displayln `("syntax object is opaque I can't see inside: \n  
(struct->vector #'foo) ~~> "
             ,(struct->vector #'foo)))

;;; Why do two copies of the syntax display? (One copy
;;; is a side-effect. The other is a result).

;;; At expansion time, I can get some graphics in Dr-Racket for
;;; definition of foo, but I cannot get likewise 
;;; not into the definition of syntax. 
(begin-for-syntax
  (displayln 
   (extract-struct-info
    (syntax-local-value
     #'foo))))  ; #'syntax))))

;;; But the access procedures for #'syntax are known!?!? (I just
;;; happen to know that there is a procedure named 'syntax-position';
;;; my whole issue is in trying to find out the list of all
;;; procedures defined in the system when the syntax type is created!)

(syntax-position #'42)

;;; Whereas #'foo is known in this module scope,
;;; (syntax struct:foo) is not known! Looks like the shorthand
;;; #'whatever for making a syntax object is known, but the longhand,
;;; presumably (syntax 'whatever), is not known.

(begin-for-syntax
  (displayln 
   (extract-struct-info
    (syntax-local-value
     #'syntax))))

~~~~~~~~

Welcome to DrRacket, version 8.2 [cs].
Language: racket, with debugging; memory limit: 128 MB.
(.#<syntax:GSI/nanosim-apu-docs/WIKIS/BELEX_3/racket-sandbx-public.rkt:6:8 
struct:foo> 
.#<syntax:GSI/nanosim-apu-docs/WIKIS/BELEX_3/racket-sandbx-public.rkt:6:8 
foo> 
.#<syntax:GSI/nanosim-apu-docs/WIKIS/BELEX_3/racket-sandbx-public.rkt:6:8 
foo?> 
(.#<syntax:GSI/nanosim-apu-docs/WIKIS/BELEX_3/racket-sandbx-public.rkt:6:8 
foo-b> 
.#<syntax:GSI/nanosim-apu-docs/WIKIS/BELEX_3/racket-sandbx-public.rkt:6:8 
foo-a>) (#f #f) #t)
. . 
../../../../../../usr/share/racket/pkgs/errortrace-lib/errortrace/stacktrace.rkt:690:2:
 
extract-struct-info: contract violation
  expected: struct-info?
  given: #<procedure:...rivate/template.rkt:563:0>
> 

On Friday, October 29, 2021 at 4:10:37 PM UTC-7 Siddhartha Kasivajhula 
wrote:

> I was able to find this interface 
> <https://docs.racket-lang.org/reference/inspectors.html#%28def._%28%28quote._~23~25kernel%29._struct-type-info%29%29>,
>  
> but it doesn't quite provide the same information. E.g. (struct-type-info 
> struct:foo)
>
> The ability to "introspect" values in a shell (or in the application) is 
> useful in languages like python (e.g. dir(object) tells you what methods 
> it provides, help(anything) gives you the interface/function signature, 
> docstrings, etc.). I haven't seen this style emphasized in Racket 
> documentation, and that may be because racket isn't object-oriented by 
> default as python is, so that there often isn't a single object 
> encapsulating all of this information.
>
> But all the same, if there are analogous facilities in racket, like the 
> kind Brian asked about, I'd love to know as well.
>
>
> On Fri, Oct 29, 2021 at 3:14 PM Brian Beckman <[email protected]> wrote:
>
>> Well, as I understand it, a struct (usually? always?), #:transparent or 
>> not, when declared, defines symbols that are meant to be visible in the 
>> current scope, so (struct foo (a b)) defines foo #|constructor|#, foo? 
>> #|instance-predicate|# foo-a and foo-b #|data accessors|# , that I can call 
>> on instances:
>>
>>     (struct foo (a b))
>>     (let ([my-foo (foo 42 37)]
>>        (list (foo? my-foo) 
>>              (foo-a my-foo) 
>>              (foo-b my-foo)))  ~~>  '(#t 42 37)
>>
>> I would like, given only the symbol foo referring to the struct type 
>> itself, to discover (at least) the list of procedures foo?, foo-a, foo-b, 
>> plus anything else the author of foo (the type) wants me to see.
>>     
>>
>> On Fri, Oct 29, 2021 at 1:45 PM John Clements <[email protected]> 
>> wrote:
>>
>>> In the text below, you refer to the “public” interface. Can I ask what 
>>> you mean by “public” in this context?
>>>
>>> John
>>>
>>> > On Oct 29, 2021, at 11:16 AM, Brian Beckman <[email protected]> 
>>> wrote:
>>> > 
>>> > I believe that run time will be the most plausible use case. I may 
>>> write macros that refer to struct-procedure names at macro-writing time, 
>>> but I don't expect to invoke the struct procedures at macro-expansion time. 
>>> My primary issue is "discoverability:" how can I find out the interface of 
>>> any struct?
>>> > 
>>> > On Thursday, October 28, 2021 at 1:00:15 PM UTC-7 [email protected] 
>>> wrote:
>>> > Are you intending to use the struct procedure names at compile time 
>>> (such as in a macro) or runtime?
>>> > 
>>> > On Tuesday, October 26, 2021 at 5:02:46 PM UTC-7 [email protected] 
>>> wrote:
>>> > I understand why structs are opaque, by default, but I want to 
>>> discover the public interface of some struct type, that is, a list of the 
>>> procedures defined by the struct.
>>> > 
>>> > Here is an example. Suppose I want to find out all the procedures 
>>> defined on an instance of the syntax struct
>>> > 
>>> >     #'42
>>> > 
>>> > Dr. Racket shows an expander clicky that shows some formatted 
>>> information inside the instance :
>>> > 
>>> > 
>>> > 
>>> > Uncapitializing the names in the display reveals the interface:
>>> > 
>>> >     (syntax-position #'42) ~~> 790
>>> >     (syntax-span #'42) ~~> 2
>>> >     (syntax-original? #'42) ~~> #t
>>> > 
>>> > etc.
>>> > 
>>> > I want to discover those procedure names in my racket program, not 
>>> manually by visually inspecting graphics in Dr Racket. 
>>> > 
>>> > I found this trick for structs that I define:
>>> > 
>>> > #lang racket
>>> > (require (for-syntax racket/struct-info))
>>> > (require racket/pretty)
>>> > 
>>> > (struct foo (a b))
>>> > (begin-for-syntax
>>> >   (displayln 
>>> >    (extract-struct-info
>>> >     (syntax-local-value
>>> >      #'foo))))
>>> > 
>>> > ~~>
>>> > 
>>> > 
>>> > 
>>> > but it doesn't work for the syntax type
>>> > 
>>> > (begin-for-syntax
>>> >   (displayln 
>>> >    (extract-struct-info
>>> >     (syntax-local-value
>>> >      #'syntax))))
>>> > 
>>> > ~~>
>>> > 
>>> > 
>>> > 
>>> > I'd be grateful for advice and an example of how to get the interface 
>>> of "syntax" without Dr Racket and without grovelling docs.
>>> > 
>>> > -- 
>>> > 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/8e4ca03e-e276-4c42-a662-4fcf7c994387n%40googlegroups.com
>>> .
>>>
>>> -- 
>> 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/CAK2VK6tMxFH0oEq4iCgk7PW-4yJTB8xNr_b3F6GPwQS1MZVLwQ%40mail.gmail.com
>>  
>> <https://groups.google.com/d/msgid/racket-users/CAK2VK6tMxFH0oEq4iCgk7PW-4yJTB8xNr_b3F6GPwQS1MZVLwQ%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/c1c4f0f3-9c8d-430d-8615-4ec2cbea90f4n%40googlegroups.com.

Reply via email to