Как работает этот пример привязки core.match? - PullRequest
3 голосов
/ 09 мая 2020

См. Этот пример :

(let [x 1 y 2]
  (match [x y]
    [1 b] b
    [a 2] a
   :else nil))
;=> 2

Я не могу понять несколько вещей:

  1. Соответствует ли 1 x и привязывается к b?
  2. Соответствует ли 2 y и привязывается к a?
  3. Предполагая, что я получил две точки выше справа, зачем возвращать a вместо b, учитывая, что они оба соответствуют части [x y]. Потому что это последнее предложение?

1 Ответ

4 голосов
/ 09 мая 2020

Думайте о каждом шаблоне как о шаблоне, который должен соответствовать входу [x y] или [1 2].

Первый шаблон - [1 b], который соответствует входу, потому что первый элемент шаблона является совпадающим литералом значение 1, а второй элемент шаблона - это привязка , которая будет содержать любое значение в этой позиции ввода, которая в данном случае равна 2. Эта привязка b доступна с правой стороны предложения match, как если бы это была привязка let.

Этот пример может продемонстрировать это более четко:

(let [x 1 y 2]
  (match [x y]
    [1 b] [1 (inc b)] ;; recreate the input with (inc b)
    [a 2] a           ;; this never matches because prior match works
    :else nil))
=> [1 3]

Соответствует ли 2 y и привязывается к a?

Шаблон совпадает, но это не имеет значения, потому что предыдущий шаблон уже совпадал. Если бы это было успешное совпадение, a было бы привязано к 1.

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