Схема макроса для "или" - PullRequest
       1

Схема макроса для "или"

3 голосов
/ 13 декабря 2011

Я изучаю «Язык программирования схем» Кента Дибвига, чтобы изучить макросы схем.

В разделе 8.2 http://www.scheme.com/tspl4/syntax.html#./syntax:h2 у него есть пример для макроса «или»:1005 *

(define-syntax or
   (syntax-rules ()
     ((_) #f)
     ((_ e) e)
     ((_ e1 e2 e3 ...)
      (let ((t e1)) (if t t (or e2 e3 ...))))))

Есть ли какая-то причина, по которой он не использовал более простую форму:

(define-syntax or
   (syntax-rules ()
     ((_) #f)
     ((_ e) e)
     ((_ e1 e2 ...)
      (let ((t e1)) (if t t (or e2 ...))))))

Расширяются ли две формы эквивалентно?

Ответы [ 2 ]

6 голосов
/ 14 декабря 2011

IMO, это сделано, чтобы сделать вещи немного яснее - ваша более простая форма зависит от порядка дел, поскольку (or x) может соответствовать как второму, так и третьему правилам. Таким образом, создание взаимоисключающих случаев облегчает чтение и делает их более надежными.

(Кстати, там есть более тонкий момент, о котором я изначально думал, что вы спрашиваете: почему бы не упростить его еще дальше:

(define-syntax or
  (syntax-rules ()
    ((_) #f)
    ((_ e1 e2 ...)
     (let ((t e1)) (if t t (or e2 ...))))))

?)

2 голосов
/ 13 декабря 2011

Подшаблон, за которым следует ..., может соответствовать нулю или более элементам ввода. Использование e1 e2 e3 делает этот случай уникальным образом отличным от предыдущего.

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