DrRacket 给出“ '(#<procedure> #<procedure> #<procedure>) ”输出

DrRacket gives the " '(#<procedure> #<procedure> #<procedure>) " output

我正在做 SICP 的 ex2.22,练习给出了一个程序,该程序打算对列表进行平方,但输出反转了列表。但是当我在 DrRacket 中输入它时,输出是意外的。 代码:

(define (square-list items)
 (define (iter things answer)
  (if (null? things)
    answer
    (iter (cdr things)
          (cons (square (car things))
                answer))))
 (iter items null))

(square-list (list 1 2 3))

预期的输出是(9 4 1)但实际上是'(#<procedure> #<procedure> #<procedure>)。我只是不知道为什么。

结果取决于 square 的定义,您可能以错误的方式定义了它。这是 square 的正确定义 returns 正确答案:

(define (square item)
  (* item item))

(define (square-list items)
 (define (iter things answer)
  (if (null? things)
    answer
    (iter (cdr things)
          (cons (square (car things))
                answer))))
 (iter items null))

(square-list (list 1 2 3))

(9 4 1)

这里您还可以注意到,根据您的计算方式,结果与原始列表相反。如果您想以相同的顺序获取它,例如,可以在 iter:

的调用末尾添加反向
(define (square-list items)
 (define (iter things answer)
  (if (null? things)
    answer
    (iter (cdr things)
          (cons (square (car things))
                answer))))
 (reverse (iter items null)))