Hello,

if you are looking for record introspection capabilities, I would recommend
looking into SRFI-99[1], which combines static structure definition and
dynamic reflection APIs. You're example could look like this:

(import
(chicken format)
srfi-42
srfi-99)

(define-record-type egg-info
make-egg-info egg-info?
name author desc)

(define (print-record/fields r)
(define rtd (record-rtd r))
(do-ec (: f (rtd-field-names rtd))
(format #t "~a: ~a~%" f ((rtd-accessor rtd f) r))))

(print-record/fields
(make-egg-info
"F-operator"
"Kon Lovett"
"Shift/Reset Control Operators"))

Ciao,
Thomas

-- 
[1]: https://srfi.schemers.org/srfi-99/srfi-99.html


Am Fr., 23. Juni 2023 um 10:03 Uhr schrieb Pan Xie <xie...@skyguard.com.cn>:

> #+begin_quote
> Perhaps if you can explain why you need to know if a symbol is bound or
> unbound, we might be able to help you better achieve your goal.
> #+end_quote
>
>
> For example, if I want to do things shown in following codes, it is useful
> to get the
> interned symbols from their names and also get their bound procedures:
>
>   (define-record egg-info
>     name author desc)
>
>   (define (show-egg-info egg)
>     (define (symbol-value sym)
>       (##sys#slot sym 0))
>
>     (define (getter field-name)
>       (symbol-value
>        (string->symbol
>         (format #f "egg-info-~a"
>                 field-name))))
>
>     (let ((fields '(name author desc)))
>       (for-each
>        (lambda (f)
>          (format #t "~a: ~a~%"
>                  f
>                  ((getter f) egg)))
>        fields)))
>
>   (show-egg-info (make-egg-info
>                   "F-operator"
>                   "Kon Lovett"
>                   "Shift/Reset Control Operators"))
>
> I think it is a very common idiom in languages from Lisp family. So it is
> important to know
> how to check symbol is bound and get its value. Every scheme
> implementation means for
> business seriously should have the ability.
>
> Thanks
> Pan
>
>
> On 6/23/23 15:40, Peter Bex wrote:
> > On Fri, Jun 23, 2023 at 03:32:38PM +0800, Pan wrote:
> >> Ah, that make sense. It seems I can just use the '##sys#slot' procedure
> to
> >> accomplish all that tasks.
> > Please don't use ##sys#slot unless you know what you're doing - the
> > procedure is unsafe and will cause segmentation faults when used on
> > non-block objects.  Anything that starts with ##sys# or ##core# etc
> > is intentionally undocumented because it's not meant for user code.
> >
> >> Would you please elaborate about the "transformed
> >> name"?  I see there are codes reference symbols like "##sys#slot" or
> >> "scheme#list", but I can't find document describe them. Is there any
> >> document I can look into? More specifically, how can I transfer "list"
> to
> >> "scheme#list"? Is there procedure can do that?
> > scheme#list is the fully qualified symbol that means it's the "list"
> > procedure from the "scheme" module.  If you do "(import scheme)" and then
> > just use "list" without prefix, it will get rewritten under the hood.
> >
> > Again, this is an implementation detail and not meant to be used
> > directly.
> >
> > Perhaps if you can explain why you need to know if a symbol is bound or
> > unbound, we might be able to help you better achieve your goal.
> >
> > Cheers,
> > Peter
>
>

Reply via email to