Не можете использовать выражения в предложениях для сопоставления с образцом ракетки? - PullRequest
0 голосов
/ 30 ноября 2018

В ракетке я сделал этот основной кусок кода.Тем не менее, ракетке, похоже, не нравится первое предложение - пытаясь запустить это, я получаю ошибку "match: синтаксическая ошибка в шаблоне в: (- 3 9)"

(define/match (prob i)
    [((- 3 9)) 0]
    [(_) 4]
)

Странно то, что если вместо процедуры вычитания я использовал процедуру «список» (т.е. ((список 3 9)) вместо ((- 3 9))), код работает.Что дает?

1 Ответ

0 голосов
/ 01 декабря 2018

Если ваша цель - проверить, равен ли аргумент i значению, в котором разрешается (- 3 9), то проблема в том, что формы Racket match не принимают произвольные выражения в качестве шаблонов.Для получения дополнительной информации о том, какие шаблоны можно использовать с формами match, ознакомьтесь с документацией Racket по Match Matching (как вы заметили, (list ...) входит в число разрешенных шаблонов!).Однако простой ответ (как прокомментировал Алекс Кнаут) состоит в том, чтобы заменить (- 3 9) на (== (- 3 9)).

С другой стороны, если ваша цель состоит в том, чтобы проверить, является ли аргумент, указанный в (prob i), буквально выражением (- 3 9), независимо от того, к чему это может привести, тогда define/match будет недостаточно,Функции ракетки передаются по значению .Поэтому, когда кто-то передает выражение в качестве аргумента i вашей функции prob, i равно вычисленному результату этого выражения, то есть

(define (some-function some-argument)
    some-argument) ; we just get the number 3 for some-argument
                   ; and have no way of knowing via this function
                   ; that someone actually passed us the expression
                   ; (- (- 9 1) 5)

(some-function (- (- 9 1) 5))

Мы быприходится использовать другой инструмент, называемый macro .Макросы работают с текстом программы до того, как символы будут оценены.Реализация макроса вашей функции (prob i) будет работать в REPL следующим образом:

> (define-syntax-rule (prob i)
    (if (equal? 'i '(- 3 9))
      0
      4))
> (prob (- 3 9))
0
> (prob -6)
4
> (prob 78)
4

Это называется "правилом синтаксиса".Он заключает в кавычки аргумент i, а затем сравнивает его с выражением в кавычках (- 3 9), чтобы увидеть, было ли оно указано как i.Дайте мне знать, если у вас все еще есть проблемы!Удачи!

...