Почему это не совпадает - PullRequest
2 голосов
/ 31 мая 2019

Я запутался в шаблоне макроса схемы

(define-syntax test

  (syntax-rules ()

    ((_ (head ... (x y) . tail))

     (syntax-error

      'tail

      "tail is"))

    ((_ any ...)

     (syntax-error "fallback"))))

, почему (test (1 7 (2 4) 34)) не соответствует первому правилу

Ответы [ 2 ]

3 голосов
/ 31 мая 2019

Список - это пара, чья cdr равна (), поэтому ваш ввод будет выглядеть так:

(1 7 (2 4) 34 . ())

Таким образом, (2 4) используется head, а 34 не совпадает с (x y).

1 голос
/ 01 июня 2019

Синтаксис правил сопоставления с образцом является жадным и не возвращается на тот же шаблон.head ... соответствует (1 7 (2 4)), но 34 не соответствует (x y) и, следовательно, не удается.Если вы ожидаете только один элемент после того, как вы можете сделать это:

(define-syntax test
  (syntax-rules ()
    ((_ (head ... (x y) last-element))
     (syntax-error
      'last-element
      "last element is"))
    ((_ any ...)
     (syntax-error "fallback"))))

Если вы пытаетесь получить ноль или более элементов после последнего списка из двух, вам нужно немного помассировать его, если вы все еще хотитеиспользуйте syntax-rules:

(define-syntax test
  (syntax-rules (build)
    ((_ build m post (x y) . tail)
     (test build #t () . tail))
    ((_ build m (post ...) any . tail)
     (test build m (post ... any) . tail))
    ((_ build #t post)
     (syntax-error
      'post
      "tail is"))
    ((_ (head ...))
     (test build #f () head ...))
    ((_ any ...)
     (syntax-error "fallback"))))

Символ в шаблоне соответствует чему угодно.Вот почему шаблон для (x y) должен идти первым, поскольку any также соответствует (2 4).например.для (test (1 7 (2 4) 34 (3 4 5))) сообщение будет (34 (3 4 5)), поскольку ни один из этих элементов не соответствует (x y), но оба соответствуют any.

Обратите внимание, что syntax-error не является частью схемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...