gpt4 book ai didi

rebol - 从 Rebol 中的系列中删除重复的对象

转载 作者:行者123 更新时间:2023-12-03 21:39:50 25 4
gpt4 key购买 nike

在 R2 和 R3 中,我可以使用 unique从系列中删除重复项:

>> a: [1 2 2 3]
>> length? a
== 4
>> length? unique a
== 3

如何对一系列对象执行相同的操作?例如。,
b: reduce [
make object! [a: 1]
make object! [b: 2]
make object! [b: 2]
make object! [c: 3]
]
>> length? b
== 4
>> length? unique b
== 4 ; (I'd like it to be 3)

最佳答案

UNIQUE 和其他集合操作中的相等检查的实现似乎是 Cmp_Value ,比较的方法是减去对象的帧指针。如果减法为零(例如,这些是 SAME? 对象),则比较被视为匹配:
f-series.c Line 283, R3-Alpha open source release
如果您查看周围的代码,您将看到在同一例程中对 Cmp_Block 的调用。在 Cmp_Block 的情况下,它进行递归比较,并尊重区分大小写……因此块和对象的行为方式之间存在差异:
Cmp_Block() in f-series.c
鉴于它是这样编写的,如果您希望 UNIQUE 操作基于对象与其身份的逐个字段比较,那么除了编写自己的例程和调用 EQUAL 之外别无他法?...或修改 C 代码。
这是一个不需要更改 C 源代码的简短技巧,它在 UNIQUE 的输出上执行 MAP-EACH。 body 过滤掉任何EQUAL?已经看到的对象(因为当 MAP-EACH 的主体返回 unset 时,它不会向结果添加任何内容):

my-unique: function [array [block!]] [
objs: copy []
map-each item unique array [
if object? :item [
foreach obj objs [
if equal? item obj [unset 'item break]
]
unless unset? :item [append objs item]
]
:item ;-- if unset, map-each adds nothing to result
]
]
不幸的是,您必须使用 BLOCK!而不是 map !随时跟踪对象,因为 MAP!目前不允许对象作为键。如果他们允许,他们可能会遇到相同的问题,即不将字段相等的对象散列相同。
(注意:修复这个和其他问题在 Ren-C 分支的雷达上,除了现在是最快的 Rebol 解释器 fundamental fixes ,还有一点 enhancements to the set operations 。讨论在 chat 中)

关于rebol - 从 Rebol 中的系列中删除重复的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33576279/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com