为什么不匹配

时间:2019-05-31 04:32:39

标签: scheme

我对方案的宏观模式感到困惑

public boolean verify(String inputStr, String savedStr) {
    try {
        byte[] savedStrBytes = HexManager.hexToByes(savedStr);
        Signature signature = cryptoObject.getSignature();
        signature.initVerify(publicKey);
        signature.update(inputStr.getBytes());
        boolean isVerified = signature.verify(savedStrBytes);
        return isVerified;
    } catch (InvalidKeyException e) {
        e.printStackTrace();
    } catch (SignatureException e) {
        e.printStackTrace();
    }
    return false;
}

为什么(define-syntax test (syntax-rules () ((_ (head ... (x y) . tail)) (syntax-error 'tail "tail is")) ((_ any ...) (syntax-error "fallback")))) 与第一个规则不匹配

2 个答案:

答案 0 :(得分:3)

列表是一对log_bin_trust_function_creatorscdr的对,因此您的输入被认为是这样的:

()

因此(1 7 (2 4) 34 . ()) (2 4)占用,而head34不匹配。

答案 1 :(得分:1)

语法规则模式匹配器是贪婪的,不会在同一模式上回退。 head ...(1 7 (2 4))匹配,但是34(x y)不匹配,因此失败。如果您只希望能有一个元素,就可以这样做:

(define-syntax test
  (syntax-rules ()
    ((_ (head ... (x y) last-element))
     (syntax-error
      'last-element
      "last element is"))
    ((_ any ...)
     (syntax-error "fallback"))))

如果您试图在最后两个列表之后获得零个或多个元素,那么您需要对其进行一些按摩,因为您仍然想使用syntax-rules

(define-syntax test
  (syntax-rules (build)
    ((_ build m post (x y) . tail)
     (test build #t () . tail))
    ((_ build m (post ...) any . tail)
     (test build m (post ... any) . tail))
    ((_ build #t post)
     (syntax-error
      'post
      "tail is"))
    ((_ (head ...))
     (test build #f () head ...))
    ((_ any ...)
     (syntax-error "fallback"))))

patytern中的符号可以匹配任何内容。这就是为什么(x y)的模式必须先行的原因,因为any也与(2 4)匹配。例如。对于(test (1 7 (2 4) 34 (3 4 5))),帖子将为(34 (3 4 5)),因为这些元素都不匹配(x y),但都匹配any

请注意,syntax-error不是Scheme的一部分。