我创建了自己的编程语言,编译为图灵机指令,我想知道如何实现if(a>b) do _ end
。这是语言的定义(也可用here)
变量是以任何宽度动态分配的,因此可以有任意大的整数
每一行都可以做三件事之一,它可以调用一个函数(修改它的参数),启动一个while循环(实际上更多是for循环),或者指定一个变量。
可用函数是incr
(递增1,可以溢出),decr
(递减1,可以溢出),pop
(从变量中删除最后一位数字), first
(将变量中最重要的0更改为1)和frost
(将最重要的1更改为零)。
while循环具有以下语法
while a <func> {
_
}
基本上每次循环时它都会<func>
到a
直到错误状态。错误条件如下,incr
和first
全部为1,decr
和frost
全部为0,pop
删除最后一位数。在使用incr
或frost
的while循环之后,循环变量的所有位都将为0,与first
和decr
相反。虽然循环必须在函数调用上结束,并且它们会在每次运行后删除其中包含的所有变量。
根据语法,分配可以做一些不同的事情。 a=b
表示将变量b
复制到变量a
所拥有的空间中,如果b
长于a
这会导致未定义的行为,除非a
是最新变量创建。 a=b,5
将b
分配给a
,左边有五个填充位(设置为零),再次溢出导致未定义的行为,除非a
是创建的最新变量。 a=a,0
将a
归零。最后,a=5,3
会将5 % 2**3
分配给a
3位。
现在我可以用
实现if(a != 0) do _ end
while a decr {
_
t=0,1
while a incr {
incr(t)
}
incr(t)
}
我的问题是如何实现其他if语句,例如if(a==b)
,if(a!=b)
和if(a>b)
作为第二个问题,这个语言图灵完全,我相信基于这个答案Are there minimum criteria for a programming language being Turing complete?。我知道语言满足1到5,但我不确定6。
答案 0 :(得分:0)
(如果我对循环或incr / decr行为有误,请告诉我,这会改变我的回答)
if(a!=0)
的原始代码似乎永远循环。实际上,它正在执行while(a) do _ end
,因为它无论是无限循环还是根本不循环。最后,t
不会存在于循环之外,并且似乎不会在其中使用,即使它看起来像您尝试捕获的值(比较时的真/假)。
您没有评论语法,因此我会在需要时提出// comment
/ c式评论。
也许是这样的......
// if (a > 0) do _ end
_a = a
while _a decr {
// overflow iif _a= 0
_ // do something
_a = 0
frost( _a ) // only function calls at end of loops
}
// if (a == 0) do _ end
_a = a
result = 1,1
while _a decr {
// overflow iif _a= 0
_a = 0
frost( result ) // only function calls at end of loops
}
while result decr {
// overflow iif result = 0
_ // do something
frost( result ) // exit loop
}
对于非零检查,模式非常简单,因为您已经注意到了 - 减少它,如果您没有溢出(技术上下溢),那么您将处理1或更大的事情。 Trick退出while
,你可以通过使用decr测试并在退出时将被测变量设置为0来完成。为此,您的frost
函数是合适的,因为对于目标变量0,它会使结果保持不变,目标1变为0,例如在result
的使用中。
您的文档说函数必须标记循环的结尾,而不是赋值或其他循环,但您自己的示例与此不一致,只需注意。
我为剩余的测试条件做了一个示例:a > b
和a == b
;其他人可以从这两个和逻辑反转/非运算符派生而来,你在上面使用result
看到过。
// if( a == b ) do _ end
a_cond = a
b_cond = b
// step 1: a_cond = a - b
while b_cond decr {
decr(a_cond)
}
// step 2: if (a_cond == 0)
result = 1,1
while a_cond decr {
// overflow iif a_cond = 0
a_cond = 0
frost( result ) // only function calls at end of loops
}
while result decr {
// overflow iif result = 0
_ // do something
frost( result ) // exit loop
}
WIP。将类似于(a == b)案例