我想在 Julia 中实现一种简单的连接语言(又名 Joy 或 Factor)作为 DSL,我很困惑如何以最佳方式表示堆栈。
代表数据和程序代码的堆栈应该能够保存一系列不同类型的项目。在最简单的情况下,Ints、Symbols 以及递归的堆栈(以表示引用的代码)。然后该程序将大量使用推送!和流行!在不同的此类堆栈之间打乱值。
Julia 中一个明显的实现是使用元胞数组,它有效但运行速度相当慢。例如,以下 Joy 堆栈[ 1 [ 1 2 +] i + ]
(计算结果为[4]
)可以在 Julia 中实现为
stack = Any[:+,:i,Any[:+,2,1],1]
。我的典型代码如下所示:
x = pop!(callstack)
if isa(x,Int)
push!(x,datastack)
elseif isa(x,Symbol)
do_stuff(x,datastack)
end
然而,这运行速度非常慢并且使用了巨大的内存分配,可能是因为这样的代码不是可类型化的(这是 Julia 的一个很大的性能瓶颈)。
使用 C,我会将堆栈紧凑地表示为联合的数组(或链表):
typedef union Stackelem{
int val;
char *sym;
union Stackelem *quote;
} Stackelem;
Stackelem stack[n];
但是如何在 Julia 中实现异构堆栈的如此紧凑的表示,以及如何避免类型不稳定性?