“JRM’s Syntax-rules Primer for the Merely Eccentric” メモ(番外その2) symbol?? について
“Syntax-rules Primer for the Merely Eccentric” では is-symbol? として出てくるものです。
(define-syntax symbol?? (syntax-rules () ((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 ((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)))))
マクロの中で、もう一段補助マクロが定義されて、そのマクロが仕事をしています。この maybe-symbol の扱いが功妙です。補助マクロの方でテンプレート部分に使用されています。
4.3.2 Pattern language
...
pattern variables that occur in the template are replaced by the subforms they match in the input.
Revised⁵ Report on the Algorithmic Language Scheme
— Richard Kelsey, William Clinger, And Jonathan Rees (Editors)
— Richard Kelsey, William Clinger, And Jonathan Rees (Editors)
5.3.2 パターン言語
...
テンプレート内に現れるパターン変数は入力内の一致する部分形式で置き換えられる。
アルゴリズム言語Schemeに関する第五改訂報告書
— RICHARD KELSEY、WILLIAM CLINGER、JONATHAN REES (編集)…20 february 1998 (犬飼 大訳: 7 May 1999)
— RICHARD KELSEY、WILLIAM CLINGER、JONATHAN REES (編集)…20 february 1998 (犬飼 大訳: 7 May 1999)
とあるので、 symbol?? マクロへシンボル、例えば symbol が渡された場合には、 (test symbol t f) というパターン部が定義されるのに対して、数値や文字列の場合には、例えば "string" が渡された場合 (test "string" t f) というパターン部が定義されます。その上で、この補助マクロへ abracadabra というシンボルが渡されて、パターンマッチが試みられるので、 symbol?? マクロへシンボルが渡された場合には t が返されます。一方、数値や文字列の場合には (test x t f) の方がマッチして f が返されます。
(symbol?? symbol #t #f) ;;-> (let-syntax ((test (syntax-rules () ((test symbol t f) t) ((test x t f) f)))) (test abracadabra #t #f)) ;;=> #t (symbol?? "string" #t #f) ;;-> (let-syntax ((test (syntax-rules () ((test "string" t f) t) ((test x t f) f)))) (test abracadabra #t #f)) ;;=> #f
唐突な abracadabra が何かモヤモヤしてしまいます。任意のシンボルであれば動作する、ということを示しているのだと思うのだけれども、使い捨てのシンボルがいきなり現れているところがモヤっと感じてしまいます。