Несколько вещей здесь:
- Вы ссылаетесь на документацию по CHICKEN 3, которая очень и очень старая (тогда
match
была частью базовой системы).Вы используете CHICKEN 4, что я вижу из того факта, что вы делаете (use matchable)
вверху, поэтому документы могут не соответствовать (каламбур) подходящей версии, которую вы используете. - Пожалуйста,рассмотрите возможность обновления до CHICKEN 5, так как CHICKEN 4. активно не разрабатывается.
- Match - это макрос, который должен иметь возможность анализировать шаблон во время компиляции, что означает, что вы не можете передать динамический список (который будетслучиться во время выполнения).Он расширяется в выражения с использованием
car
, cdr
и т. Д., Основываясь на шаблоне, который разделяет входные данные.Это не может быть сделано, если шаблон не известен во время компиляции.
Если вы действительно должны передать шаблон динамически, вы можете сделать что-то вроде этого:
(use matchable)
;; Define patt to be available at the macro expansion level
(define-for-syntax patt '('and (X Y) Z))
;; Make a macro that *expands* to the desired match form
(define-syntax match-patt
(ir-macro-transformer
(lambda (e i c)
`(match ,(cadr e)
(,(i patt) (list ,(i 'X) ,(i 'Y) ,(i 'Z)))))))
;; Actually call the macro to generate the expression
(define prop '(and (#t #t) #t))
(match-patt prop)
Конечно, это все еще может работать, только если шаблон известен во время компиляции, так что на самом деле это ничего не купит, если вы не делаете действительно причудливые вещи, такие как чтение шаблона во время компиляции из файла или чего-то еще.
При программировании на Лиспе (или Схеме) вы всегда должны помнить, на каком уровне процесса расширения вы программируете.Обычно существует два уровня: время компиляции и время выполнения.Макросы расширяются в код во время компиляции, поэтому вы никогда не сможете заставить макрос работать с информацией, доступной во время выполнения.
Конечно, вы также можете сгенерировать выражение соответствия, используя eval
.Оцененный код снова запускается в два этапа: сначала происходит макроразложение, а после этого выполняется код.Но поскольку вы делаете все это из запущенной программы, вы можете вставить выражения, которые были определены во время выполнения, в eval.