Racket中用模式匹配实现字符串拼接报匹配子句错误如何解决
问题原因
你遇到的报错来自两个核心的语法错误:
1. 函数调用时参数提前求值
你写的(addString (+ "a" "b"))会先对括号内的(+ "a" "b")执行求值操作,而不是把(+ "a" "b")作为一个S表达式列表传给addString。
你的match规则要求匹配的入参是第一个元素为符号+、后面跟随两个值的列表,所以你调用的时候需要给参数加单引号阻止提前求值,写法改为:
(addString '(+ "a" "b"))
2. 准引用模式的语法错误
你写的模式`(+ , x, y)不符合Racket准引用的语法要求:,变量名是不可拆分的整体,逗号和变量之间不能加空格,你额外加的空格会让模式匹配规则变成匹配含5个元素的列表(+、逗号、x、逗号、y),和你预期的三元素列表完全不符。
修正后的函数写法为:
(define (addString e) (match e [`(+ ,x ,y) (string-append x y)]))
修正两个问题后,运行(addString '(+ "a" "b"))就可以得到你预期的结果"ab"。
内容的提问来源于stack exchange,提问作者Zach Snyder
相关产品推荐
相关产品推荐

