列表到可匹配模式的转换(Chicken 方案)

List to pattern conversion in matchable (Chicken scheme)

我有一个模式列表,如何将它们转换为适合匹配函数?

(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

这是文档,我还不是很明白所以也许有人可以帮我举例说明我正在尝试做的事情。

这里有几件事:

  • 您 link 阅读了 CHICKEN 3 的文档,该文档非常古老(当时 match 是核心系统的一部分)。您正在使用 CHICKEN 4,我可以从您在顶部执行 (use matchable) 的事实看出这一点,因此文档可能与您正在使用的可匹配版本不匹配(双关语)。
  • 请考虑更新到 CHICKEN 5,因为 CHICKEN 4 尚未积极开发。
  • Match 是一个宏,需要能够在编译时分析模式,这意味着您不能传入动态列表(这将在 运行 时发生)。它根据分离输入的模式,使用 carcdr 等扩展为表达式。如果模式在编译时未知,则无法执行此操作。

如果你真的必须动态传递模式,你可以这样做:

(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)

当然,这仍然只有在模式在编译时已知的情况下才有效,所以这并不能真正给你带来任何好处,除非你正在做一些非常奇特的事情,比如在编译时从文件中读取模式什么的。

在使用 Lisp(或 Scheme)进行编程时,您必须始终牢记您是在扩展过程的哪个级别进行编程。通常有两个级别:编译时和运行-时。宏在编译时扩展为代码,因此您永远无法让宏对 运行 时可用的信息进行操作。

当然,您也可以使用eval生成匹配表达式。分两个阶段再次评估代码 运行s:首先发生宏扩展,然后 运行ning 代码发生。但是因为您是在 运行ning 程序中完成这一切,所以您可以将在 运行 时间确定的表达式注入 eval。