我对方案的宏观模式感到困惑
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"))))
与第一个规则不匹配
答案 0 :(得分:3)
列表是一对log_bin_trust_function_creators
为cdr
的对,因此您的输入被认为是这样的:
()
因此(1 7 (2 4) 34 . ())
被(2 4)
占用,而head
与34
不匹配。
答案 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的一部分。