在代码中引入这样的表达方式如何?

rationese是我正在开发的编程语言,弄一小段示例代码,展示如何在过程式代码中,使用逻辑编程的搜索方式,看看这种表达方式是否需要,有哪些用处。

示例1:
var a[10];
a[*]=0

*是通配符,所以代码的意思是,对数组进行初始化

示例2:
var a[10];
int x;
(x>=3) and (x<=8);
a.x=0;

代码的意思是,对3到8下标的数组元素进行初始化

示例3:
var a[10]=[1,2,5,4,3,4,6,4,4,0];
a[x]=4;
y=f(x);
print(y);

这段代码是过程式的,但是它带有逻辑式编程的搜索功能。
a[x]=4的结果是,x得到4个值,4,6,8,9。

所以y也可能有多个值

最后print(y)会输出y的所有取值。

目前我们所说的事务大多是对于处理数据库而言的,其实,事务的概念如果能扩展到代码的级别,可以为我们带来非常大的方便。

原因是,如果我们把程序在运行的某个时刻的状态看做一个事实空间,这个事实空间是随着代码的运行在不断的变化的,在每个时刻,我们都可以用一组事实和规则去描述当前的事实空间。

但有些时候,代码出错了,在某行语句的运行还未完成的时候就出错了,这时候,你可能无法用预先定义好的谓词来完整的描述这个事实空间。这种状态,我称为“逻辑完整性”遭到了破坏。

例如把一个图片从某个位置挪到新的位置,在挪之前,你可以描述道:图片在某个位置。在挪动之后,你也可以说,图片在某个位置。但是在挪到一半的时候,你怎么说?在你的描述体系里,这种状态根本就不存在。而“图片”的抽象,也就被破坏了。

这时候要写出错处理代码是困难的,因为你没法按照事先的逻辑描述去把状态恢复,而只能通过小心的查看底层的处理方式,才能知道哪些状态遭到了破坏,应该做什么样的处理才能够恢复这种逻辑完整性,而且这些处理也是超越逻辑的怪异方式,你事先设计好的抽象方法就没法描述它们,这就造成了所谓的抽象泄露。在上面的例子中,底层代码的意外错误导致对“图片”的抽象被破坏了,露出了内存操作这种你根本就不应该关心,也是根本就不了解的问题。

这时候,事务就是非常必要的,事务处理的目的,就是为了时刻保持这种逻辑完整性,在逻辑处于中间的不完整状态时,如果操作失败,程序能够自动回退到事务开始之前的状态,以便代码进行出错处理。

这就需要语言从底层就支持代码级别的事务。

2010年10月08日 09:47 "banq"的内容
消灭数组是现代语言的一个方向 ...

消滅的可能性不大,進化成另一種形式而已。

不论底层用什么方式实现,但数字方式的下标引用从形式上会一直存在下去。

进化的方向是加入其它能力:


a[1].next 等于a[2]
insert(a[1],m) 在某个元素之前插入新元素
a.first a.last

等等。

2010年10月11日 16:12 "uda1341"的内容
目前我们所说的事务大多是对于处理数据库而言的,其实,事务的概念如果能扩展到代码的级别,可以为我们带来非常大的方便。 ...

建议参考scala的内存事务模型。

2010年09月27日 14:05 "uda1341"的内容
示例1:
var a[10];
a[*]=0

*是通配符,所以代码的意思是,对数组进行初始化

示例2:
var a[10];
int x;
(x>=3) and (x<=8);
a.x=0;

代码的意思是,对3 ...

首先我觉得你的想法很不错,但的确有点不妥,如果是面向对象语言的话,
你这样
var a[10];
a.x
你的变量下,怎么又能有属性呢?
照你的这个写法,这语言的逻辑真的优点混乱了

var a[10]=[1,2,5,4,3,4,6,4,4,0];
a[x]=4;
y=f(x);
print(y);
这里的y 不是强制类型的,这样类型的变量,可能会产生不可预知的错误。

您认为呢?

var a[10];
a.x

这样写也没什么问题,a.*=0 就表示初始化了。

y=f(x)

y会是一个集合,相当于从x的一个集合通过f函数映射到y的一个集合,和map的意思差不多。

如果分得要更清楚一点,可以从类型上区分单变量和变量集合。