Racket ISL中使用列表抽象定义引文占位函数的实现问题
Racket引文占位生成函数修复方案
核心问题点
当前实现的两个问题本质都是换行符拼接的边界处理不统一:
- 手动递归加分支判断的写法,把单条引文内部换行、不同引文之间的换行逻辑拆分到了两个位置,很容易遗漏边界情况导致末尾多出换行,或者换行位置错误
- 手写递归完全可以用列表折叠操作替代,去掉冗余的cond分支,逻辑更统一
可直接通过测试的foldr实现
以下实现完全匹配给出的测试用例结果,全程用foldr处理所有拼接逻辑,不会出现末尾多余换行:
(define (citation-space num) (local [; 生成对应序号的单条引文内容块 (define (single-citation n) (define citation-lines (list (string-append "[" (number->string n) "] author information") "title information" "venue information" "year & page information")) ; 折叠拼接单条引文的行,仅在行后有其他内容时插入换行 (foldr (λ (current-line rest-content) (if (string=? rest-content "") current-line (string-append current-line "\n" rest-content))) "" citation-lines)) ; 生成从1到入参num的所有引文序号列表 (define all-indices (build-list num add1))] ; 折叠拼接所有引文块,仅在块后有其他引文时插入换行 (foldr (λ (current-idx rest-citations) (if (string=? rest-citations "") (single-citation current-idx) (string-append (single-citation current-idx) "\n" rest-citations))) "" all-indices)))
实现逻辑说明
- 所有换行插入逻辑遵循同一个规则:当前拼接的内容后面还有其他内容时,才在末尾加
\n,从规则层面避免了最后一行/最后一个引文块后面出现多余换行的问题 - 用
build-list生成1到num的序号列表,替代手动写递归遍历数字的逻辑,不需要单独处理num=0、num=1的边界情况,foldr会自动处理空列表、单元素列表的场景 - 单条引文内部的行拼接、多个引文块之间的拼接都用foldr实现,逻辑完全统一,后续如果要修改引文行数、调整内容,只需要修改
citation-lines里的列表项即可,不需要改动拼接逻辑
内容的提问来源于stack exchange,提问作者user19636979
相关产品推荐
相关产品推荐

