【问题标题】:Translating ?x style pattern variables to optima将 ?x 样式模式变量转换为 optima
【发布时间】:2014-03-26 02:46:23
【问题描述】:

这两个模式匹配示例在 optima 中的等价物是什么 - 分别来自 On Lisp 和 PAIP?

>(match ’(p a b c a) ’(p ?x ?y c ?x))
((?Y . B) (?X . A))
T


(difference between ?x* and ?y*)

【问题讨论】:

    标签: pattern-matching common-lisp


    【解决方案1】:

    optima 中的模式看起来好像正在构建您要匹配的表单。所以例如在这个简单的例子中:

    (ql:quickload "optima")
    (defpackage #:example (:use #:common-lisp #:optima))
    (in-package #:example)
    (match '(a b c) ((list 'a 'b X) (print X)))
    

    模式是(list 'a 'b x) 的形式,最后一个形式将打印:c

    (match '(a b c d) ((list* 'a 'b x) (print x))) 将打印在哪里:(c d)

    您可能熟悉用于构建列表的特殊语法,称为反引号。它通常用于定义宏,构造了许多 s 表达式。有一个用于 optima 的附加包,可让您以相同的方式编写模式。

    (ql:quickload '("fare-quasiquote-optima" "fare-quasiquote-readtable"))
    (named-readtables:in-readtable :fare-quasiquote)
    
    (match '(a b c) (`(a b ,x) x))
    (match '(a b c) (`(a b ,@x) x))
    

    最后两个表单将分别返回 c(c)

    【讨论】:

    • 很好的答案,感谢fare-quasiquote-optima 的例子!顺便说一句,我发现第一个例子比“甜”的例子更有意义,因为后者失去了listlist*的语义价值。
    猜你喜欢
    • 2016-12-09
    • 2012-01-07
    • 2021-12-11
    • 1970-01-01
    • 2021-12-12
    • 2021-05-11
    • 2020-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多