对于Racket中的每个循环对

时间:2018-03-23 15:30:44

标签: racket

我正在尝试在Racket中打印一对值列表(表示键/值对)。

这是我现在的代码:

#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)))

当我运行该示例时,它会打印:

{
a: 1,

然后,它崩溃了这个错误消息:

application: not a procedure;
 expected a procedure that can be applied to arguments
  given: #<void>
  arguments...: [none]
  context...:

  /.../racket/collects/racket/private/map.rkt:58:19: loop
   "test.rkt": [running body]
   for-loop
   run-module-instance!125
   perform-require!78

知道发生了什么事吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

这是个问题。你的lambda体周围有一组额外的括号,即:

( (displayln (format "~a: ~a;" (car kv) (cdr kv))) )

由于displayln用于副作用,因此其输出无效,因此您的错误消息表明您尝试运行(#<void>)

通常,每当您收到错误说明"expected a procedure that can be applied to arguments"时,请查看代码块中是否有括号问题。像Racket博士这样的编辑会为你突出该区域。