* sxml-match bad pattern syntax @ 2021-12-28 6:21 Thien-Thi Nguyen 2021-12-28 7:19 ` tomas 0 siblings, 1 reply; 6+ messages in thread From: Thien-Thi Nguyen @ 2021-12-28 6:21 UTC (permalink / raw) To: guile-user [-- Attachment #1.1: Type: text/plain, Size: 328 bytes --] In an effort to join the current millennium, i have started to play w/ Guile 2.x's SXML facilities. Good stuff! I've run into a problem, however, and hope i can get help resolving it here. The following small program attempts to use ‘sxml-match’ to remove an unwanted attribute from a (well-formed) SXML snippet. [-- Attachment #1.2: UNBOGUS --] [-- Type: text/plain, Size: 303 bytes --] #!/usr/bin/guile -s !# (use-modules (sxml match)) (define (unbogus x) (sxml-match x ((a (@ . ,attrs) ...) `(a (@ ,@(delete '(shape "rect") attrs)) ...)))) (define bad '(a (@ (shape "rect") (href "foo.html")) "kid")) (pk bad) (pk (unbogus bad)) ;; expect: (a (@ (href "foo.html")) "kid") [-- Attachment #1.3: Type: text/plain, Size: 754 bytes --] When i run it, i see it fail w/ error message: sxml/sxml-match.ss:342:31: Throw to key `sxml-match-error' with args `(#f "bad pattern syntax (symbol not allowed in this context)" [...] (output folded and truncated). To my untrained eye, the form looks similar to the examples in Info node ‘(guile) sxml-match’ but evidently i am missing something. What? -- Thien-Thi Nguyen ----------------------------------------------- (defun responsep (query) ; (2021) Software Libero (pcase (context query) ; = Dissenso Etico (`(technical ,ml) (correctp ml)) ...)) 748E A0E8 1CB8 A748 9BFA --------------------------------------- 6CE4 6703 2224 4C80 7502 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 219 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: sxml-match bad pattern syntax 2021-12-28 6:21 sxml-match bad pattern syntax Thien-Thi Nguyen @ 2021-12-28 7:19 ` tomas 2021-12-28 7:58 ` Thien-Thi Nguyen 0 siblings, 1 reply; 6+ messages in thread From: tomas @ 2021-12-28 7:19 UTC (permalink / raw) To: guile-user [-- Attachment #1: Type: text/plain, Size: 1534 bytes --] On Tue, Dec 28, 2021 at 01:21:31AM -0500, Thien-Thi Nguyen wrote: > > In an effort to join the current millennium, :-) > i have started to > play w/ Guile 2.x's SXML facilities. Good stuff! I've run into > a problem, however, and hope i can get help resolving it here. > > The following small program attempts to use ‘sxml-match’ to > remove an unwanted attribute from a (well-formed) SXML snippet. > #!/usr/bin/guile -s > !# > (use-modules > (sxml match)) > > (define (unbogus x) > (sxml-match x > ((a (@ . ,attrs) ...) > `(a (@ ,@(delete '(shape "rect") attrs)) ...)))) I /think/ the ellipsis is at a wrong place there. Note that I'm coming from "traditional" match, and I just have wrapped half of my brain around that (which, BTW, is somewhat painful :-) So take this with a grain of salt. * Phenomenology (aka: I barely know what I'm doing): If you replace your ellipses above by ". ,rest", things seem to work: (define (unbogus x) (sxml-match x ((a (@ . ,attrs) . ,rest) `(a (@ ,@(delete '(shape "rect") attrs)) . ,rest)))) (unbogus '(a (@ (shape "rect") (href "foo.html")) "kid")) => (a (@ (href "foo.html")) "kid") * Philosophy (aka blah, blah) If those ellipses resemble what match do, I think they are wrong there: (@ . ,attrs) ... would mean zero or more times the shape "(@ . ,attrs)". I think this isn't what you want. Put grains of salt everywhere :) Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: sxml-match bad pattern syntax 2021-12-28 7:19 ` tomas @ 2021-12-28 7:58 ` Thien-Thi Nguyen 2021-12-28 8:28 ` tomas 0 siblings, 1 reply; 6+ messages in thread From: Thien-Thi Nguyen @ 2021-12-28 7:58 UTC (permalink / raw) To: guile-user [-- Attachment #1.1: Type: text/plain, Size: 1479 bytes --] () <tomas@tuxteam.de> () Tue, 28 Dec 2021 08:19:04 +0100 I /think/ the ellipsis is at a wrong place there. Note that I'm coming from "traditional" match, and I just have wrapped half of my brain around that (which, BTW, is somewhat painful :-) Haha, i know exactly how you feel. So take this with a grain of salt. * Phenomenology (aka: I barely know what I'm doing): If you replace your ellipses above by ". ,rest", things seem to work: (define (unbogus x) (sxml-match x ((a (@ . ,attrs) . ,rest) `(a (@ ,@(delete '(shape "rect") attrs)) . ,rest)))) (unbogus '(a (@ (shape "rect") (href "foo.html")) "kid")) => (a (@ (href "foo.html")) "kid") Cool. I guest the ". ,rest" is a shortcut for the ellipses. * Philosophy (aka blah, blah) If those ellipses resemble what match do, I think they are wrong there: (@ . ,attrs) ... would mean zero or more times the shape "(@ . ,attrs)". I think this isn't what you want. Ah, right! The ellipses are a tail that need to follow a head. I guess i was confused by the documentation's use of ellipses in the conventional sense rather than the literal sense: (define (album->html x) (sxml-match x [(album (@ (title ,t)) (catalog (num ,n) (fmt ,f)) ...) `(ul (li ,t) (li (b ,n) (i ,f)) ...)])) Anyway, thanks to your help, i've managed to cobble together the following code, attached here for the benefit of future self: [-- Attachment #1.2: UNBOGUS --] [-- Type: text/plain, Size: 559 bytes --] #!/usr/bin/guile -s !# (use-modules (ice-9 pretty-print) (sxml match)) (define (pp x) (pretty-print x) (newline)) (define (unbogus x) (sxml-match x ((a (@ . ,attrs) . ,rest) `(a (@ ,@(delete '(shape "rect") attrs)) . ,rest)) (,otherwise (if (string? x) x `(,(car x) ,(cadr x) ,@(map unbogus (cddr x))))))) (define one '(a (@ (shape "rect") (href "foo.html")) "kid")) (newline) (pp one) (pp (unbogus one)) (define bad `(p (@) "some text and " ,one " and " ,one)) (newline) (pp bad) (pp (unbogus bad)) [-- Attachment #1.3: Type: text/plain, Size: 441 bytes --] Maybe it's idiomatic. Feedback on how to improve it welcome! -- Thien-Thi Nguyen ----------------------------------------------- (defun responsep (query) ; (2021) Software Libero (pcase (context query) ; = Dissenso Etico (`(technical ,ml) (correctp ml)) ...)) 748E A0E8 1CB8 A748 9BFA --------------------------------------- 6CE4 6703 2224 4C80 7502 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 219 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: sxml-match bad pattern syntax 2021-12-28 7:58 ` Thien-Thi Nguyen @ 2021-12-28 8:28 ` tomas 2021-12-28 9:21 ` Thien-Thi Nguyen 0 siblings, 1 reply; 6+ messages in thread From: tomas @ 2021-12-28 8:28 UTC (permalink / raw) To: guile-user [-- Attachment #1: Type: text/plain, Size: 1880 bytes --] On Tue, Dec 28, 2021 at 02:58:56AM -0500, Thien-Thi Nguyen wrote: > > () <tomas@tuxteam.de> > () Tue, 28 Dec 2021 08:19:04 +0100 > > I /think/ the ellipsis is at a wrong place there [...] > Haha, i know exactly how you feel. %-) > Ah, right! The ellipses are a tail that need to follow a head. No, the ellipses tell the matcher that the symbol to its left acutally stands for "zero or more of this". Consequently, you have to somehow [1] use those ellipses on the right hand side (aka template) whenever you use them on the left hand side (aka pattern) and vice versa. > I guess i was confused by the documentation's use of ellipses in > the conventional sense rather than the literal sense: I think of the ellipses as a kind of funny Kleene star. Not really at home in any world: in the regular world, because it isn't a star, in the Scheme world, because it is postfix. So, to come back on your original example, (@ . ,attrs) ... would match either empty (remember: zero or more) or (@ (foo 1) (bar 2)) or (@ (meep 1)) (@ "this ain't what we expected)) ... so zero or more of (@ . stuff) where stuff stands for any S-expression (note that it's sloppy: it will match things which aren't lists of well-formed attribute lists [2]). It won't match (@ (foo 1)) (@ (bar 2)) ("rumpelstilzchen") for example. > Anyway, thanks to your help, i've managed to cobble together the > following code, attached here for the benefit of future self: [...] Thanks. And thanks for the code :) > Maybe it's idiomatic. Feedback on how to improve it welcome! For the idiomatic part, I'll have to defer to those with more chevrons ;-) Cheers [1] Yes, some handwaving here. [2] which isn't what you want to match, anyway. You want to match things with one attribute list in them. Cheers -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: sxml-match bad pattern syntax 2021-12-28 8:28 ` tomas @ 2021-12-28 9:21 ` Thien-Thi Nguyen 2021-12-28 10:06 ` tomas 0 siblings, 1 reply; 6+ messages in thread From: Thien-Thi Nguyen @ 2021-12-28 9:21 UTC (permalink / raw) To: guile-user [-- Attachment #1: Type: text/plain, Size: 1709 bytes --] () <tomas@tuxteam.de> () Tue, 28 Dec 2021 09:28:32 +0100 > Ah, right! The ellipses are a tail that need to follow a > head. No, the ellipses tell the matcher that the symbol to its left acutally stands for "zero or more of this". Consequently, you have to somehow [1] use those ellipses on the right hand side (aka template) whenever you use them on the left hand side (aka pattern) and vice versa. I think we're saying the same thing, but in any case, i understand what you're saying. > I guess i was confused by the documentation's use of > ellipses in the conventional sense rather than the literal > sense: I think of the ellipses as a kind of funny Kleene star. Not really at home in any world: in the regular world, because it isn't a star, in the Scheme world, because it is postfix. That's a really good analogy, IMHO. It's an operator of sorts. [examples] Yes, it's becoming more clear to me now. For the idiomatic part, I'll have to defer to those with more chevrons ;-) :-D I think the ‘otherwise’ clause is a bit unwieldy; it presumes normal form 3 (attribute lists always present). However, i couldn't find a way to match "any element". ISTM the element portion (first symbol in the form) MUST be non-variable. -- Thien-Thi Nguyen ----------------------------------------------- (defun responsep (query) ; (2021) Software Libero (pcase (context query) ; = Dissenso Etico (`(technical ,ml) (correctp ml)) ...)) 748E A0E8 1CB8 A748 9BFA --------------------------------------- 6CE4 6703 2224 4C80 7502 [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 219 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: sxml-match bad pattern syntax 2021-12-28 9:21 ` Thien-Thi Nguyen @ 2021-12-28 10:06 ` tomas 0 siblings, 0 replies; 6+ messages in thread From: tomas @ 2021-12-28 10:06 UTC (permalink / raw) To: guile-user [-- Attachment #1: Type: text/plain, Size: 1016 bytes --] On Tue, Dec 28, 2021 at 04:21:39AM -0500, Thien-Thi Nguyen wrote: > > () <tomas@tuxteam.de> > () Tue, 28 Dec 2021 09:28:32 +0100 > > > Ah, right! The ellipses are a tail that need to follow a > > head. > > No, the ellipses tell the matcher that the symbol to its left [...] > I think we're saying the same thing, but in any case, i > understand what you're saying. I see now. I was mis-reading you. [...] > I think the ‘otherwise’ clause is a bit unwieldy; it presumes > normal form 3 (attribute lists always present). However, i > couldn't find a way to match "any element". ISTM the element > portion (first symbol in the form) MUST be non-variable. At first blush it seems so. At least, when I try [1], it yells at me with something something Throw to key `sxml-match-error' with args `(#f "bad pattern syntax (not an element pattern)" ... Hm. Cheers [1] what I try is matching the tag to an unquoted var, like so (match ((,tag ...))). -- t [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 195 bytes --] ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2021-12-28 10:06 UTC | newest] Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2021-12-28 6:21 sxml-match bad pattern syntax Thien-Thi Nguyen 2021-12-28 7:19 ` tomas 2021-12-28 7:58 ` Thien-Thi Nguyen 2021-12-28 8:28 ` tomas 2021-12-28 9:21 ` Thien-Thi Nguyen 2021-12-28 10:06 ` tomas
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).