perl6的功能类似于"car cdr cons"中的方案?

lis*_*tor 5 arrays cons perl6 cdr

我真的很喜欢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); }
Run Code Online (Sandbox Code Playgroud)

谢谢.

sml*_*mls 9

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

使用嵌套的Pairs

A Pair代表键值对.例如,当迭代a时Hash,你得到一系列Pairs.

如果你认为a Pair是一个cons单元格,那么你可以构建一个链接列表Pair,即Lisp,它将另一个Pair作为其值,然后将另一个Pair作为其值,依此类推.

  • =>运营商(Pair构造函数)满足的角色缺点.
  • .key方法实现了汽车的作用.
  • .value方法履行cdr的作用.

例:

my $l = (1 => (2 => (3 => (4 => (5 => Nil)))));
say $l.key;    # 1
say $l.value;  # 2 => 3 => 4 => 5 => Nil
Run Code Online (Sandbox Code Playgroud)

=>操作是右结合的,让第一线,也没有括号写:

my $l = 1 => 2 => 3 => 4 => 5 => Nil;
Run Code Online (Sandbox Code Playgroud)

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

sub cons ($x, $y)  { $x => $y }
sub car  (Pair $y) { $y.key   }
sub cdr  (Pair $y) { $y.value }
Run Code Online (Sandbox Code Playgroud)

但请注意,没有内置的便利功能可以使用这种Pair基于链接的列表进行列表处理.因此,如果你想做相当于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..*] }
Run Code Online (Sandbox Code Playgroud)

一些评论:

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