Преобразование списка в шаблон в сопоставимых (схема Курица) - PullRequest
0 голосов
/ 07 февраля 2019

У меня есть список шаблонов, как я могу преобразовать их в функцию соответствия?

(use matchable)
(define prop '(and (#t #t) #t))
(define patt '(and (X Y) Z)) ;;here is the pattern example
(match prop [('and (X Y) Z) (list X Y Z)])) ;;(#t #t #t) this works
(match prop [patt (list X Y Z)])) ;;anything matches the pattern???

Последнее совпадение не работает, все мои переменные являются символами, я не уверенчто они находятся внутри выражения совпадения

https://wiki.call -cc.org / man / 3 / Pattern% 20matching

Это документы, я не совсемеще не понимаю, так что, может быть, кто-то может помочь мне с примером того, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 07 февраля 2019

Несколько вещей здесь:

  • Вы ссылаетесь на документацию по 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.

...