guile-user
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: Understanding `symbol??` macro from okmij.org


From: Maxime Devos
Subject: RE: Understanding `symbol??` macro from okmij.org
Date: Thu, 14 Mar 2024 02:03:07 +0100

(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.




reply via email to

[Prev in Thread] Current Thread [Next in Thread]