2014-10-06 30 views
1

我想了解sicp中的模式匹配。 https://www.youtube.com/watch?v=amf5lTZ0UTc&list=PL8FE88AA54363BC46&index=7模式匹配 - 执行?,?c,?v

他在模式规则中创建了这3个过程,但没有实现。

对这些有什么意义吗?

模式匹配 - ???实施的C,V

https://github.com/f03lipe/sicp-code/blob/master/code/4A.scm

foo  - matches exactly foo 
(f a b) - matches list in which first element if f, second is a, third is b 
(? x)  - matches anything, call it x 
(?c x) - matches constant, call it x 
(?v x) - matches variable, call it x 

(define deriv-rules 
    '(
     ((dd (?c c) (? v))   0) 
     ((dd (?v v) (? v))   1) 
     ((dd (?v u) (? v))   0) 

或者没有实现,因为在所有这些都只是正在评估的规则?

+0

我如何理解匹配foo和(f a b)意味着什么? – runners3431 2014-12-08 23:10:59

+0

当教授说foo与foo匹配时 - 他的意思是说像*或+这样的东西究竟意味着什么? – runners3431 2014-12-18 03:24:12

回答

1

他们实际上不是程序。它们是语法的一部分,代表一个任意常量,任意变量或任何东西。所以在比赛过程中。您可以在视频的第35分钟看到:

((ARBITRARY-CONSTANT? pat) 
(if (CONSTANT? exp) 
    (extend-dict pat exp dict) 
    'failed)) 
((ARBITRARY-VARIABLE? pat) 
(if (VARIBLE? exp) 
    (extend-dict pat exp dict) 
    'failed)) 
((ARBITRARY-EXPRESSION? pat) 
(extend-dict pat exp dict)) 

这是要评估此语法的位置。在此基础上,我们可以简单地定义为程序:

(define (tagged-list? tag exp) 
    (eq? tag (car exp))) 

(define (arbitrary-constant? pat) ; (?c c) 
    (tagged-list? '?c pat)) 
(define (arbitrary-variable? pat) ; (?v v) 
    (tagged-list? '?v pat)) 
(define (arbitrary-expression? pat) ; (? v) 
    (tagged-list? '? pat)) 

蚂蚁,基本上是它。这些用于抽象模式,因此您可以稍后更改语法,而不必更改匹配过程。

+0

它在视频中解释的方式对我来说似乎太抽象了。有没有更容易的方法来了解如何学习这种模式匹配? – runners3431 2014-10-22 21:25:34

+0

@ runners3431你是指一般的模式匹配,还是这个特定的例子?你不明白什么? – Rptx 2014-10-22 21:35:07

+0

rptx:我不明白,派生规则只是一个使用符号引用的列表。所以我可以拿车或者任何规则的干部来解析它。 – runners3431 2014-12-05 20:30:39