作为对我之前提出的问题(链接)的跟进,我正在尝试在Clojure中实现简单的模式匹配。
我想要实现类似以下的功能:
我想要实现类似以下的功能:
(match target
[ub] expr1 ; ub should be bound to actual value in expr1
['< ub] expr2 ; match the literal less-than symbol
; and ub should be bound to actual value in expr2
[lb ub] expr3 ; lb and ub should be bound to actual values in expr3
:else expr4 ; default case if none match
)
使用方法:
(match [< 5.0] ...)
应该在运行时安排执行expr2
。
我想写一个宏,但我不确定扩展的内容。
我正在考虑让每个情况和子句扩展为一个带有内部变量绑定和检查字面符号('<
)实际匹配模式的let
。也许对于第二个模式(['< ub]
):
(let [[sym1 ub] pattern]
(if (= '< sym1)
expr1)
我需要在绑定中使用 (gensym)
吗?如何使用?
更大的图景:
(range-case target
[0.0 < 1.0] :greatly-disagree
[< 2.0] :disagree
[< 3.0] :neutral
[< 4.0] :agree
[5.0] :strongly-agree
42 :the-answer
:else :do-not-care)
我正在尝试匹配 [...]
模式并将其转换为以下内容:
[ub] (if previous-ub `(and (<= ~previous-ub ~target) (<= ~target ~ub))
`(< ~target ~ub))
['< ub] (if previous-ub `(and (<= ~previous-ub ~target) (< ~target ~ub))
`(< ~target ~ub))
[lb ub] `(and (<= ~lb ~target) (<= ~target ~ub))
['< lb ub] `(and (< ~lb ~target) (<= ~target ~ub))
[lb '< ub] `(and (<= ~lb ~target) (< ~target ~ub))
['< lb '< ub] `(and (< ~lb ~target) (< ~target ~ub))
我有一个cond
,用于检查case部分是否为向量。这个模式匹配应该出现在该case内。