加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

数组 – perl6函数类似于计划中的“car cdr cons”?

发布时间:2020-12-15 21:47:22 所属栏目:大数据 来源:网络整理
导读:我真的很喜欢perl6和计划.我想知道perl6中的函数是否与方案中的“cons,car,cdr”函数类似?我一直在做的事情很麻烦: sub cons($a,$aList) { return flat($a,$aList); } # sometimes flat is undesired;sub car($aList) { return first($aList); }sub cdr($a
我真的很喜欢perl6和计划.我想知道perl6中的函数是否与方案中的“cons,car,cdr”函数类似?我一直在做的事情很麻烦:
sub cons($a,$aList) { return flat($a,$aList); } # sometimes flat is undesired;
sub car($aList) { return first($aList); }
sub cdr($aList) { return tail($aList.elems - 1); }

谢谢.

解决方法

Perl 6列表/数组不是链表.
但是,Pair类型可用于构建链接列表,并提供这三个Lisp函数的功能.

使用嵌套对

Pair表示键值对.例如,当迭代Hash时,您将获得一系列对.

如果你认为一个Pair作为一个cons单元格,那么你可以建立一个Lisp链表作为一个对,它有另一个Pair作为它的值,而另一个Pair又作为它的值,依此类推.

> => operator(Pair构造函数)履行cons的作用.
> .key方法履行汽车的角色.
> .value方法履行cdr的角色.

例:

my $l = (1 => (2 => (3 => (4 => (5 => Nil)))));
say $l.key;    # 1
say $l.value;  # 2 => 3 => 4 => 5 => Nil

=> operator是右关联的,因此第一行也可以在没有括号的情况下编写:

my $l = 1 => 2 => 3 => 4 => 5 => Nil;

如果你想用他们熟悉的名称声明Lisp函数,它将如下所示:

sub cons ($x,$y)  { $x => $y }
sub car  (Pair $y) { $y.key   }
sub cdr  (Pair $y) { $y.value }

但请注意,没有内置的便利功能可以使用这种基于对的链表进行列表处理.因此,如果你想做相当于Scheme的长度或附加函数等,那么你必须自己编写这些函数.所有内置列表处理例程都假定普通的Perl 6列表或兼容的Iterable类型,而Pair不是.

使用普通的Perl 6列表

如果你想使用普通的Perl 6列表/数组作为你的数据结构,但是为它们实现了Lisp函数的行为,我会这样写:

sub cons ($x,$y) { $x,|$y  }
sub car  (@y)     { @y[0]    }
sub cdr  (@y)     { @y[1..*] }

一些评论:

>而不是使用flat,我使用| operator将$y的元素放入外部列表中.
>第一个函数没有在您的代码中执行您所期望的操作.它用于搜索列表.它将第一个参数(在您的情况下为$aList)解释为谓词,将剩余的参数(在您的情况下为none)解释为要搜索的列表,因此在您的情况下它始终返回Nil.
为了返回列表的第一个元素,您可以使用[ ] positional subscripting operator,就像我在这里做的那样.> return关键字是可选的;自动返回函数的最后一个语句的结果.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读