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
相关产品推荐
相关产品推荐

