【发布时间】:2018-01-23 18:49:39
【问题描述】:
我已经定义了一个map 过程和一个square 过程。 square 过程可以正常工作,但 map 仅在定义两次时才有效。
给定以下代码:
; Squares a number.
(define square (lambda (n)
(* n n)
))
; Applies function f on all elements of l.
(define map (lambda (l f)
(cond
((null? l) '())
(else (cons (f (car l)) (map (cdr l) f)))
)
))
这个程序在执行时崩溃:
> (map '(1 2 3) square)
; mcar: contract violation
; expected: mpair?
; given: #<procedure:square>
; [,bt for context]
但是,鉴于以下代码,该程序按预期运行。唯一的区别是 map 现在被定义了两次。
; Squares a number.
(define square (lambda (n)
(* n n)
))
; Applies function f on all elements of l.
(define map (lambda (l f)
(cond
((null? l) '())
(else (cons (f (car l)) (map (cdr l) f)))
)
))
(define map (lambda (l f)
(cond
((null? l) '())
(else (cons (f (car l)) (map (cdr l) f)))
)
))
这个版本很好用:
> (map '(1 2 3) square)
{1 4 9}
是什么导致了这个问题,应该如何解决?
【问题讨论】:
-
在 MIT-Scheme 中,您的代码运行良好,
-
@GeorgFuss 在 Racket 中运行它。不过很有趣。