是否可以将模式列表和exp应用于匹配?

时间:2018-05-31 18:13:41

标签: design-patterns racket matching

我想在Racket中使用函数match来获取exp0给出的第一个元素。

(define mylist '(['c c] ['a a] ['* *]))

(match '* mylist))

但这不起作用。它抛出一个错误“预期带有模式和结果的子句”。我怎样才能实现它?

1 个答案:

答案 0 :(得分:1)

(首先,你有一个小问题;我真的不想在你引用的列表中引用你的密钥;那将产生实际上包含符号的列表的密钥&# 34;引用"。基本上,不要在报价中加上引号。)

接下来:您可能正在寻找其中一种不同的东西。

第一个也是最明显的答案就是使用dict-ref

之类的东西
#lang racket

(define mylist '([c c] [a a] [* *]))

(dict-ref mylist '*)

...生成列表'(*)。您可以阅读dict-ref上的文档,了解它为什么是列表。

这将很好地工作,直到你真的想要使用match给你的更丰富的匹配语义。如果您只想使用相等匹配,请使用上面的解决方案。

所以,让我们说你正在寻找一个由字母' a后跟一个数字组成的密钥:

#lang racket

(define mylist
  '([(c b) c]
    [(a 3) a]
    [(* *) *]))

(findf (match-lambda [(list (list 'a (? number?)) _) #t]
                     [other #f])
       mylist)