【发布时间】:2014-06-15 10:43:14
【问题描述】:
我似乎无法找到在 Ruby 中使用 Scheme 的 cons 框的方法(似乎几乎所有数组)。这是一个相当粗略的大纲:
class cons
def initialize (car, cdr)
@car = car
@cdr = cdr
end
#return the car of the pair
def car
return @car
end
#return the cdr of the pair
def cdr
return @cdr
end
end
我可以传递两个值并调用car 和cdr,但这不是任何类型的列表(只有两个值)。如何制作一个列表,我可以在其中插入一些内容,如 Scheme cons:
myCons = (cons(1, cons(2, cons(3, cons(4, 5)))))
我能找到的最接近的方法是创建自己的数组,例如 myArray = Array[1, 2, 3, 4, 5],然后使用 puts myArray.join(' ')。这只给了我"1 2 3 4 5"而不是(1 2 3 4 5),这还没有考虑到我仍然不能用缺点构建数组,我只是自己做的。
【问题讨论】:
-
在尝试实现任何东西之前,您至少应该学习 Ruby 语法的基础知识。
Class cons在 Ruby 中无效。 -
你的问题与Ruby无关。看来您根本不了解缺点列表的工作原理。也许你应该问一个问题?
-
一个 cons 单元格只是一个包含两个字段的结构。这已经足够实现单链表的结构了,在 Lisp 中,约定是一个列表要么是符号
nil(空列表,也写为()),要么是一个 cons 单元格,其中car单元格的第一个元素是列表的第一个元素,cdr是列表的 rest(即nil或其他列表)。就这样。在 Lisps 中,以一种特殊的方式打印这个很方便,但这只是为了展示。 -
请参阅Dot notation in scheme 和Recursive range in Lisp adds a period? 了解更多关于这些约定以及
cons、car和cdr必须做什么。前面的评论说 cons 单元格是具有两个字段的结构,但这超出了保证范围。例如,您可以只使用词法闭包,如 this answer 到 What is the Definition of a Lisp Cons Cell?。 -
@JoshuaTaylor 没错。请参阅我对
Cons类的实现,它确实实现了点分符号。