* Understanding `symbol??` macro from okmij.org
@ 2024-03-14 0:18 Zelphir Kaltstahl
2024-03-14 1:01 ` Jean Abou Samra
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Zelphir Kaltstahl @ 2024-03-14 0:18 UTC (permalink / raw)
To: Guile User
Hello Guile Users!
I am having trouble understanding how the `symbol??` macro from
https://okmij.org/ftp/Scheme/assert-syntax-rule.txt works.
Here is what I have so far:
~~~~start~~~~
;; (symbol?? FORM KT KF)
;; FORM is an arbitrary form or datum.
;; A symbol? predicate at the macro-expand time.
;; Expands in KT if FORM is a symbol (identifier), Otherwise, expands in KF.
;; KT: Continuation/Case in case of true.
;; KF: Continuation/Case in case of false.
(define-syntax symbol??
(syntax-rules ()
;; The check is done by first pattern matching against some other
;; forms, that are not a symbol.
((symbol?? (x . y) kt kf) kf) ; It's a pair, not a symbol
((symbol?? #(x ...) kt kf) kf) ; It's a vector, not a symbol
;; After those things are excluded, the thing might be a symbol.
((symbol?? maybe-symbol kt kf)
(let-syntax ((test
(syntax-rules ()
((test maybe-symbol t f) t)
((test x t f) f))))
(test abracadabra kt kf)))))
~~~~~end~~~~~
So I don't understand why `test` works or how it works to check, whether
`maybe-symbol` is a symbol or not. And I don't understand how `abracadabra`
helps with that, or why it helps, to pass something undefined.
Can someone help me understand, what is going on there?
Actually I am trying to understand the whole page, and I got there while looking
for a good `assert` macro ... rabbit hole and all that.
Best regards,
Zelphir
--
repositories:https://notabug.org/ZelphirKaltstahl
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 0:18 Understanding `symbol??` macro from okmij.org Zelphir Kaltstahl
@ 2024-03-14 1:01 ` Jean Abou Samra
2024-03-14 1:03 ` Maxime Devos
2024-03-14 14:52 ` Olivier Dion
2 siblings, 0 replies; 8+ messages in thread
From: Jean Abou Samra @ 2024-03-14 1:01 UTC (permalink / raw)
To: Zelphir Kaltstahl, Guile User
[-- Attachment #1: Type: text/plain, Size: 1772 bytes --]
Hi!
The explanations are on
https://okmij.org/ftp/Scheme/macros.html#macro-symbol-p
Maybe this version will be easier to understand (we don't really
need continuation-passing style here):
(define-syntax symbol??
(syntax-rules ()
((symbol?? maybe-symbol)
(let-syntax
((test
(syntax-rules ()
((test maybe-symbol) #t)
((test _) #f))))
(test abracadabra)))))
(symbol?? foo) ⇒ #t
(symbol?? (a . b)) ⇒ #f
(symbol?? 5) ⇒ #f
(symbol?? "a") ⇒ #f
(symbol?? #(1 a)) ⇒ #f
Basically: the macro call
(symbol?? <foobar>)
expands to a macro definition of test as
(syntax-rules ()
((test <foobar>) #t)
((test _) #f))
and a call (test abracadabra). Now, observe that if <foobar>
is a symbol, then it's a catch-all pattern when inserted
in the syntax-rules definition of `test`, so it will match
abracadabra (because it matches anything). On the other hand,
if it's not a symbol, then it won't match abracadabra, by case
analysis: if it's a number it will only match that number; booleans,
strings and characters likewise; if it's a pair it can only match
pairs; if it's a vector it can only match vectors; etc.
I'm not exactly sure why Oleg Kiselyov included special cases for a pair
and a vector, but my guess is that not all Scheme implementations
support vectors in syntax-rules patterns (and the pair check is
necessary because the car or cdr could contain a vector). The Scheme
standards certainly have their opinion on this, and I knew that
stuff by heart at some point (when I implemented a syntax-rules/syntax-case
expander for a university project), but I don't remember, and it's
too late for scouring the standards...
Best,
Jean
[-- Attachment #2: This is a digitally signed message part --]
[-- Type: application/pgp-signature, Size: 228 bytes --]
^ permalink raw reply [flat|nested] 8+ messages in thread
* RE: Understanding `symbol??` macro from okmij.org
2024-03-14 0:18 Understanding `symbol??` macro from okmij.org Zelphir Kaltstahl
2024-03-14 1:01 ` Jean Abou Samra
@ 2024-03-14 1:03 ` Maxime Devos
2024-03-14 13:46 ` Zelphir Kaltstahl
2024-03-14 14:52 ` Olivier Dion
2 siblings, 1 reply; 8+ messages in thread
From: Maxime Devos @ 2024-03-14 1:03 UTC (permalink / raw)
To: Zelphir Kaltstahl, Guile User
(define-syntax symbol??
(syntax-rules ()
;; The check is done by first pattern matching against some other
;; forms, that are not a symbol.
((symbol?? (x . y) kt kf) kf) ; It's a pair, not a symbol
((symbol?? #(x ...) kt kf) kf) ; It's a vector, not a symbol
The first two cases don’t need any explanation I think.
;; After those things are excluded, the thing might be a symbol.
((symbol?? maybe-symbol kt kf)
(let-syntax ((test
(syntax-rules ()
((test maybe-symbol t f) t)
((test x t f) f))))
(test abracadabra kt kf)))))
If maybe-symbol is a symbol, then (test abracadabra kt kf) matches (test maybe-symbol t f) (let t=kt, f=kf, maybe-symbol=abracadabra).
If maybe-symbol is not a symbol, for example it is a string “hello” (please ignore wrong quoting), then
(test maybe-symbol t f) becomes (test “hello” t f). The string “hello” cannot act as an identifier (because it is a string, not a symbol), so (test abracadabra kt kf) does not match the first case (test maybe-symbol t f). Only the second case (test x t f) remains, and (test abracadabra kt kf) matches this (set x to abracadabra, t to kt, f to kf).
I think the first two cases are superfluous, but perhaps there is a performance advantage.
(I’m wondering if this still works in the case (symbol? ...), because ... is special in syntax-rules)
Best regards,
Maxime Devos.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 1:03 ` Maxime Devos
@ 2024-03-14 13:46 ` Zelphir Kaltstahl
0 siblings, 0 replies; 8+ messages in thread
From: Zelphir Kaltstahl @ 2024-03-14 13:46 UTC (permalink / raw)
To: Maxime Devos, Jean Abou Samra; +Cc: Guile User
On 3/14/24 02:01, Jean Abou Samra wrote:
> Hi!
>
> The explanations are on
>
> https://okmij.org/ftp/Scheme/macros.html#macro-symbol-p
>
> Maybe this version will be easier to understand (we don't really
> need continuation-passing style here):
>
> (define-syntax symbol??
> (syntax-rules ()
> ((symbol?? maybe-symbol)
> (let-syntax
> ((test
> (syntax-rules ()
> ((test maybe-symbol) #t)
> ((test _) #f))))
> (test abracadabra)))))
>
> (symbol?? foo) ⇒ #t
> (symbol?? (a . b)) ⇒ #f
> (symbol?? 5) ⇒ #f
> (symbol?? "a") ⇒ #f
> (symbol?? #(1 a)) ⇒ #f
>
>
> Basically: the macro call
>
> (symbol?? <foobar>)
>
> expands to a macro definition of test as
>
> (syntax-rules ()
> ((test <foobar>) #t)
> ((test _) #f))
>
> and a call (test abracadabra). Now, observe that if <foobar>
> is a symbol, then it's a catch-all pattern when inserted
> in the syntax-rules definition of `test`, so it will match
> abracadabra (because it matches anything). On the other hand,
> if it's not a symbol, then it won't match abracadabra, by case
> analysis: if it's a number it will only match that number; booleans,
> strings and characters likewise; if it's a pair it can only match
> pairs; if it's a vector it can only match vectors; etc.
>
> I'm not exactly sure why Oleg Kiselyov included special cases for a pair
> and a vector, but my guess is that not all Scheme implementations
> support vectors in syntax-rules patterns (and the pair check is
> necessary because the car or cdr could contain a vector). The Scheme
> standards certainly have their opinion on this, and I knew that
> stuff by heart at some point (when I implemented a syntax-rules/syntax-case
> expander for a university project), but I don't remember, and it's
> too late for scouring the standards...
>
> Best,
> Jean
On 3/14/24 02:03, Maxime Devos wrote:
>
> (define-syntax symbol??
>
> (syntax-rules ()
>
> ;; The check is done by first pattern matching against some other
>
> ;; forms, that are not a symbol.
>
> ((symbol?? (x . y) kt kf) kf) ; It's a pair, not a symbol
>
> ((symbol?? #(x ...) kt kf) kf) ; It's a vector, not a symbol
>
> The first two cases don’t need any explanation I think.
>
> ;; After those things are excluded, the thing might be a symbol.
>
> ((symbol?? maybe-symbol kt kf)
>
> (let-syntax ((test
>
> (syntax-rules ()
>
> ((test maybe-symbol t f) t)
>
> ((test x t f) f))))
>
> (test abracadabra kt kf)))))
>
> If maybe-symbol is a symbol, then (test abracadabra kt kf) matches (test
> maybe-symbol t f) (let t=kt, f=kf, maybe-symbol=abracadabra).
>
> If maybe-symbol is not a symbol, for example it is a string “hello” (please
> ignore wrong quoting), then
>
> (test maybe-symbol t f) becomes (test “hello” t f). The string “hello” cannot
> act as an identifier (because it is a string, not a symbol), so (test
> abracadabra kt kf) does not match the first case (test maybe-symbol t f). Only
> the second case (test x t f) remains, and (test abracadabra kt kf) matches
> this (set x to abracadabra, t to kt, f to kf).
>
> I think the first two cases are superfluous, but perhaps there is a
> performance advantage.
>
> (I’m wondering if this still works in the case (symbol? ...), because ... is
> special in syntax-rules)
>
> Best regards,
>
> Maxime Devos.
>
Thank you both!
Mind-blowing stuff. But I think I understand it now. How clever.
Best regards,
Zelphir
--
repositories:https://notabug.org/ZelphirKaltstahl
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 0:18 Understanding `symbol??` macro from okmij.org Zelphir Kaltstahl
2024-03-14 1:01 ` Jean Abou Samra
2024-03-14 1:03 ` Maxime Devos
@ 2024-03-14 14:52 ` Olivier Dion
2024-03-14 15:57 ` Jean Abou Samra
2 siblings, 1 reply; 8+ messages in thread
From: Olivier Dion @ 2024-03-14 14:52 UTC (permalink / raw)
To: Zelphir Kaltstahl, Guile User
Excuse my ignorance, by why is symbol?? not written using syntax-cases
and the `indentifier?' guard?
On Thu, 14 Mar 2024, Zelphir Kaltstahl <zelphirkaltstahl@posteo.de> wrote:
> Hello Guile Users!
>
> I am having trouble understanding how the `symbol??` macro from
> https://okmij.org/ftp/Scheme/assert-syntax-rule.txt works.
>
> Here is what I have so far:
>
> ~~~~start~~~~
> ;; (symbol?? FORM KT KF)
> ;; FORM is an arbitrary form or datum.
> ;; A symbol? predicate at the macro-expand time.
> ;; Expands in KT if FORM is a symbol (identifier), Otherwise, expands in KF.
> ;; KT: Continuation/Case in case of true.
> ;; KF: Continuation/Case in case of false.
> (define-syntax symbol??
> (syntax-rules ()
> ;; The check is done by first pattern matching against some other
> ;; forms, that are not a symbol.
> ((symbol?? (x . y) kt kf) kf) ; It's a pair, not a symbol
> ((symbol?? #(x ...) kt kf) kf) ; It's a vector, not a symbol
> ;; After those things are excluded, the thing might be a symbol.
> ((symbol?? maybe-symbol kt kf)
> (let-syntax ((test
> (syntax-rules ()
> ((test maybe-symbol t f) t)
> ((test x t f) f))))
> (test abracadabra kt kf)))))
> ~~~~~end~~~~~
>
> So I don't understand why `test` works or how it works to check, whether
> `maybe-symbol` is a symbol or not. And I don't understand how `abracadabra`
> helps with that, or why it helps, to pass something undefined.
>
> Can someone help me understand, what is going on there?
>
> Actually I am trying to understand the whole page, and I got there while looking
> for a good `assert` macro ... rabbit hole and all that.
>
> Best regards,
> Zelphir
>
> --
> repositories:https://notabug.org/ZelphirKaltstahl
--
Olivier Dion
oldiob.ca
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 14:52 ` Olivier Dion
@ 2024-03-14 15:57 ` Jean Abou Samra
2024-03-14 16:39 ` Olivier Dion
0 siblings, 1 reply; 8+ messages in thread
From: Jean Abou Samra @ 2024-03-14 15:57 UTC (permalink / raw)
To: Olivier Dion; +Cc: Zelphir Kaltstahl, Guile User
> Excuse my ignorance, by why is symbol?? not written using syntax-cases
> and the `indentifier?' guard?
a) Because it's intellectually interesting to see what the power of syntax-rules is :)
b) Not all Scheme standards and implementations contain syntax-case.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 15:57 ` Jean Abou Samra
@ 2024-03-14 16:39 ` Olivier Dion
2024-03-14 18:01 ` Jean Abou Samra
0 siblings, 1 reply; 8+ messages in thread
From: Olivier Dion @ 2024-03-14 16:39 UTC (permalink / raw)
To: Jean Abou Samra; +Cc: Zelphir Kaltstahl, Guile User
On Thu, 14 Mar 2024, Jean Abou Samra <jean@abou-samra.fr> wrote:
>> Excuse my ignorance, by why is symbol?? not written using syntax-cases
>> and the `indentifier?' guard?
>
> a) Because it's intellectually interesting to see what the power of syntax-rules is :)
> b) Not all Scheme standards and implementations contain syntax-case.
Ah, and I though that syntax-rules was always written in term of
syntax-case. I see. Thank you!
--
Olivier Dion
oldiob.ca
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: Understanding `symbol??` macro from okmij.org
2024-03-14 16:39 ` Olivier Dion
@ 2024-03-14 18:01 ` Jean Abou Samra
0 siblings, 0 replies; 8+ messages in thread
From: Jean Abou Samra @ 2024-03-14 18:01 UTC (permalink / raw)
To: Olivier Dion; +Cc: Zelphir Kaltstahl, Guile User
> Ah, and I though that syntax-rules was always written in term of
> syntax-case. I see. Thank you!
Yeah, it most most often is these days, but historically, syntax-rules was invented before syntax-case. IIRC, the choice to include syntax-case in R6RS was controversial because syntax-rules was expressed in terms of different low-level abstractions in some Scheme implementations ("explicit substitutions" or something like that).
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2024-03-14 18:01 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-03-14 0:18 Understanding `symbol??` macro from okmij.org Zelphir Kaltstahl
2024-03-14 1:01 ` Jean Abou Samra
2024-03-14 1:03 ` Maxime Devos
2024-03-14 13:46 ` Zelphir Kaltstahl
2024-03-14 14:52 ` Olivier Dion
2024-03-14 15:57 ` Jean Abou Samra
2024-03-14 16:39 ` Olivier Dion
2024-03-14 18:01 ` Jean Abou Samra
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).