You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:30:53