From: Andreas Reuleaux <rx@a-rx.info>
To: guile-user <guile-user@gnu.org>
Subject: unusual let binding (of lp) - in function element->xml from sxml simple
Date: Sat, 03 Feb 2024 21:51:01 +0000 [thread overview]
Message-ID: <87zfwhrzcq.fsf@softland> (raw)
Hi,
I have a hard time understanding the let binding lp ...
in the function element->xml - from module sxml simple -
repeated here for convenience.
--8<---------------cut here---------------start------------->8---
(define (element->xml tag attrs body port)
(check-name tag)
(display #\< port)
(display tag port)
(if attrs
(let lp ((attrs attrs))
(if (pair? attrs)
(let ((attr (car attrs)))
(display #\space port)
(if (pair? attr)
(attribute->xml (car attr) (cdr attr) port)
(error "bad attribute" tag attr))
(lp (cdr attrs)))
(if (not (null? attrs))
(error "bad attributes" tag attrs)))))
(if (pair? body)
(begin
(display #\> port)
(let lp ((body body))
(cond
((pair? body)
(sxml->xml (car body) port)
(lp (cdr body)))
((null? body)
(display "</" port)
(display tag port)
(display ">" port))
(else
(error "bad element body" tag body)))))
(display " />" port)))
--8<---------------cut here---------------end--------------->8---
Some background: sxml simple is - as the name implies -
simple (or should be so). - It's implements
* functions for parsing xml to s-expression
xml->sxml, ...
* and functions for serializing sxml to xml
sxml->xml, ... (and among them: element->xml, as above)
This second task (group of functions) is even simpler
(than the parsing stuff) - I would say.
Now these function (sxml->xml, element->xml) work for
me: I can test them with some simple s-expression foo for example
--8<---------------cut here---------------start------------->8---
(define foo
'(d:para (d:emphasis (@ (role "strong")) "system analyst") " for " (d:link (@ (xl:href "http://www.blah.com")) (d:emphasis (@ (role "strong")) "Blah")) " in Berlin, and so on"))
--8<---------------cut here---------------end--------------->8---
--8<---------------cut here---------------start------------->8---
scheme@(guile-user) [13]> (sxml->xml foo)
<d:para><d:emphasis role="strong">system analyst</d:emphasis> for
<d:link xl:href="http://www.blah.com"><d:emphasis role="strong">Blah</d:emphasis></d:link> in Berlin, and so on</d:para>
--8<---------------cut here---------------end--------------->8---
sxml->xml making use of element->xml above.
Now with regards to the binding / usage of lp above: it is
bound / used several times:
(let lp ((attrs attrs)) ...
let lp be a function that ... does what?
(lp (cdr attrs)))
now call this function with (cdr attrs).
What does it do?
set attrs to (cdr attrs)?
then similar below
(let lp ((body body)) ...
???
(lp (cdr body)))
???
For one thing I am used to
(let bindings body)
with bindings being of the form
((x 'foo)
(y 'bar))
(i.e. bind x with 'foo, y with 'bar when executing body)
for example, lp is not of this style. Maybe if there is just one variable bound
one can shortcut this to
let x 'foo body
Is this what's going on above? And if so:
then lp is bound to a list of one pair? :
((attrs attrs))
how come can we call this as a function then later.
And if attrs is a function (which I doubt) that what
is the application of attrs to attrs?
Anyway: confused. - Thanks in advanc,
A'
next reply other threads:[~2024-02-03 21:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-02-03 21:51 Andreas Reuleaux [this message]
2024-02-03 21:55 ` unusual let binding (of lp) - in function element->xml from sxml simple Thompson, David
2024-02-03 22:16 ` Andreas Reuleaux
2024-02-04 6:30 ` tomas
2024-02-04 8:46 ` Damien Mattei
2024-02-04 15:37 ` Andreas Reuleaux
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
List information: https://www.gnu.org/software/guile/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87zfwhrzcq.fsf@softland \
--to=rx@a-rx.info \
--cc=guile-user@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).