我正在 DrRacket 上调试这段代码:
#lang racket
(define last-element-on-list
(lambda l
(cond ((null? l) '())
((null? (cdr l)) (car l))
(else (last-element-on-list (cdr l)))
)
)
)
(define lst '(
(n 25 f +)
(s 25 m +)
(ll 20 no -)))
(list-ref lst 0)
(last-element-on-list (list-ref lst 0))
代码(list-ref lst 0)
回报'(n 25 f +)
,但是当我进入程序时last-element-on-list
参数l
有价值((n 25 f +))
.
Why l
是过程中列表的列表last-element-on-list
?
两者之间是有区别的(lambda (x) ...)
形式和(lambda x ...)
form.
观察这两个示例之间的区别:
;; Example 1.
(define f
(lambda (x)
(if (list? x)
(display "x is a list!")
(display "x is not a list"))))
(f 1) ; Displays "x is not a list".
;; Example 2.
(define g
(lambda x
(if (list? x)
(display "x is a list!")
(display "x is not a list"))))
(g 1) ; Displays "x is a list!".
The (lambda x ...)
形式允许 lambda 接受任意数量的参数,所有参数都放入绑定到的列表中x
在 lambda 的体内。 IE。x
是参数列表。
这就是为什么当你给予g
一个列表(例如(g '(1 2 3))
), x
将'((1 2 3))
(列表的列表)。
要修复您的代码:
(define last-element-on-list
(lambda (l) ; <- ATTENTION.
(cond ((null? l) '()) ; FIXME: raise error instead.
((null? (cdr l)) (car l))
(else (last-element-on-list (cdr l))))))
您可以阅读更多有关lambda
in 球拍指南 https://docs.racket-lang.org/guide/lambda.html。特别是,请查看第 4.4.1 节(声明剩余参数)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)