传递给过程的列表转换为过程内列表的列表

2024-04-06

我正在 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(使用前将#替换为@)

传递给过程的列表转换为过程内列表的列表 的相关文章

随机推荐