Если ваша цель - проверить, равен ли аргумент 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
.Дайте мне знать, если у вас все еще есть проблемы!Удачи!