【问题标题】:Scheme: Adding to a list of records方案:添加到记录列表
【发布时间】:2012-12-17 22:14:44
【问题描述】:

我正在为学校做一个计划任务,有一个问题涉及我们定义一个记录“类型”(实现为一个列表)(它代表一个音乐记录)。

我遇到的问题是我被要求创建一个创建这些记录列表的过程,然后是一个将记录添加到该列表的函数。这很简单,但我觉得我可能做错了什么。

我知道如何将元素附加到列表(即本例中的记录架),但我不确定如何在调用此 add 函数时正确维护此列表。这是我得到的:

(define (add-record record lst)
  (append lst (list record)))

按我的预期工作,但我的问题是当我调用此过程时。

(define record-self '())

这是我的第一次尝试,但当然每次我使用 add-record 过程添加记录时,传入刚刚定义的 record-shelf 列表,我的 add 函数返回一个全新的列表(即副本,附上记录)。这是有道理的,但我不确定这是否是我想要的。

所以如果我想像这样向列表中添加一堆记录:

(add-record highway61 record-shelf)
(add-record sgtPepper record-shelf)

当然它不会产生我想要的结果,因为record-shelf 没有得到更新。而且我认为目前在课程中我们不应该使用set! 或作业。

我是否应该每次都获取返回列表的副本(来自add-record),然后在下一次调用中使用该返回列表?

【问题讨论】:

  • 在函数式编程中你应该避免使用全局变量。所以你最后一个问题的答案是“是”。 (add-record sgtPepper (add-record highway61 record-shelf))
  • 顺便说一句,问题表达得很好。

标签: scheme racket


【解决方案1】:

您希望有状态的行为。正如 Enrique 所说,您最后一个问题的答案是肯定的。

有什么理由不能让cons 将新记录排在首位?这是在 Lisp 中将项目添加到列表的惯用方式。或者在任何使用单链表的函数式语言中。

(define (add-record record lst)
  (cons record lst))

(define newshelf (add-record 36chambers oldshelf))

如果不以某种形式使用set!,就无法在调用add-record 后使record-shelf 包含新项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2019-03-05
    • 1970-01-01
    • 2021-06-08
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多