我学习R5RS计划在时刻(从PocketScheme),我觉得我可以用内置于计划的一些变种,但是功能还不是全部:!追加

在换言之 - 破坏性改变的列表

我不是那么在实际的代码更感兴趣的答案多达理解由哪一个可以通过一个列表作为函数(或载体或字符串),然后它变异的过程。

示例:

(define (append! lst var)
    (cons (lst var))
)

当我使用的方法如上述,我必须做类似(define list (append! foo (bar)),我想的东西更通用。

有帮助吗?

解决方案

突变,虽然允许的,强烈方案气馁。 PLT甚至到目前为止,以消除set-car!set-cdr!(虽然他们与set-mcar!set-mcdr!“改为”他们)去了。然而,对于append!一个规范出现的 SRFI-1 。这append!比你有点不同。在SRFI,实施可以的,但并不需要修改利弊细胞追加列表。

如果你想有一个append!是的保证的要变更被附加到列表中的结构,你可能不得不自己编写。这并不难:

(define (my-append! a b)
  (if (null? (cdr a))
      (set-cdr! a b)
      (my-append! (cdr a) b)))

要保持定义简单,没有错误检查在这里,但很明显,则需要的长度为至少1作为a,和(优选地)作为b一个(任意长度的)列表的列表来传递。所述a原因必须至少为长度1是因为你不能空列表上set-cdr!

由于您希望在如何工作的,我会看看我能不能解释一下。基本上,我们想要做的是沿着列表a,直到我们到达最后cons对,这是(<last element> . null)。所以,我们先看看a已经在列表中的最后一个元素通过检查在null cdr。如果是,我们用set-cdr!将其设置为我们要追加列表,我们就大功告成了。如果没有,我们要呼吁my-append!cdr a。每次我们这样做的时候,我们更接近a结束。由于这是一个变异操作,我们不会返回任何东西,所以我们并不需要担心形成我们的修改列表作为返回值。

其他提示

比从不为投入夫妇2-3美分,这个话题犹未晚...

(1)没有什么错误使用方案的有一个单一的参考stucture被修改破坏性过程。因此,例如,有效地建立大的列表中,通过单个参考零碎 - 当完成时,使该(现在大概不要被改性的)列表已知的,并且从不同的对象,称为

(2),我认为APPEND!应该表现得像追加,只(潜在的)破坏性。所以添加!应该指望任何数量的清单作为参数。每个列表但最后大概要建立的CDR!“d下。

(3)APPEND的上述定义!本质上是在Mac Lisp和Common Lisp的NCONC。 (和其他的Lisp)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top