模式匹配 - 实现?,?c,?v

时间:2014-10-06 15:15:55

标签: scheme sicp

我试图了解sicp中的模式匹配。 https://www.youtube.com/watch?v=amf5lTZ0UTc&list=PL8FE88AA54363BC46&index=7

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

这些有什么意义吗?

模式匹配 - 实现?,?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)

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

1 个答案:

答案 0 :(得分: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))

Ant基本上就是它。这些用于抽象模式,因此您可以稍后更改语法,而无需更改匹配过程。