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

Racket中遍历键值对的for-each循环运行报错,求排查方案

问题原因分析与修复方案

你遇到的这个崩溃问题,核心原因是lambda表达式里多套了一层不必要的括号。

看你代码里的这段关键逻辑:

(lambda (kv)
  ( (displayln (format "~a: ~a," (car kv) (cdr kv)))))

在Racket里,括号的核心作用是调用过程。你这里把(displayln ...)的执行结果又套了一层括号,而displayln执行后返回的是#<void>(一个表示无返回值的特殊值),Racket会尝试把这个void当成可调用的过程来执行,自然就抛出了「application: not a procedure」的错误。

修复后的基础版本

只需要去掉那层多余的括号就能解决崩溃问题:

#lang racket
(define (write-json keyvalues)
  (displayln "{")
  (for-each (lambda (kv)
              (displayln (format "~a: ~a," (car kv) (cdr kv))))
            keyvalues)
  (displayln "}"))
(write-json (list (cons "a" 1) (cons "b" 2)))

不过这段代码输出的内容最后一个键值对会多一个逗号,不符合严格的JSON规范。

优化版(输出标准JSON格式)

如果想输出符合规范的JSON,可以用map生成所有键值对字符串,再用string-join处理逗号问题:

#lang racket
(define (write-json keyvalues)
  (displayln "{")
  (when (not (empty? keyvalues))
    (displayln (string-join (map (lambda (kv)
                                   (format "  ~a: ~a" (car kv) (cdr kv)))
                                 keyvalues)
                            ",\n")))
  (displayln "}"))
(write-json (list (cons "a" 1) (cons "b" 2)))

这个版本会输出标准格式的内容:

{
  a: 1,
  b: 2
}

内容的提问来源于stack exchange,提问作者Juiblex

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:03