2014-12-05 31 views
0

我确信Rascal已经构建了对堆栈的支持(例如,通过堆栈推送/弹出来进行表达式评估),但是我找不到任何东西。Rascal中堆栈的最佳方式?

所以我现在用这个。但是有没有更好的方法?

list stack = []; 

流行:

value = stack[size(stack)-1]; 
stack = stack - value; 

stack = stack + value 
+0

另一个评估表达式的好方法是直接使用递归。我想知道什么时候你会选择一个明确的堆栈。是因为你有多个返回值,不想使用元组或全局变量?或为了效率? – jurgenv 2014-12-08 09:38:36

回答

0

我建议改变流行到:

value = stack[-1]; //short hand notation 
stack = delete(stack, size(stack)-1); // to make sure the last item is deleted (in case duplicates exist in the list) 
+0

感谢您的回答 – robert 2014-12-05 12:16:28

+0

对于第二行,您还可以说stack = stack [0 ..- 1],它会做同样的事情([0 ..- 1]是除最后一个元素之外的所有内容),并且是一点更简洁。或者,只需使用Paul Klint在其答案中提到的List中的堆栈函数即可。 – 2014-12-05 12:19:51

0

看一看在 List模块的文档:列出supp或与堆栈相关的整个动物园功能:push,pop,top,dup

+0

是的,但返回一个元组的值和新列表并不方便。为什么Rascal不支持引用?在这种情况下,我们可以做pop(myList),并且在返回值之后,列表也会减少。另外,与通过引用相比,这种按值传递不是非常缓慢? – robert 2014-12-05 12:24:12

+0

Rascal基于严格的价值语义。这避免了许多有关别名的复杂问题,并增加了可理解性。参考文献打破这种模式在引擎盖下,很多分享都完成了,所以你付出的代价是可以接受的。 – 2014-12-05 12:27:18

+0

List中的'pop'不适用于堆栈,因为在元组中返回的列表的第一个元素被删除而不是最后一个。 – AShahi 2014-12-05 13:03:09