-
Couldn't load subscription status.
- Fork 1.1k
Description
最近一直在写一些package,写的时候有了些想法。
泛型
在C++中,我们可以用模版完成泛型:
template <class T>
T maximum(T a, T b) {
return (a > b) ? a : b;
}在目前的wenyan中,我们可以使用如下的方式进行近似:
吾有一術。名之曰「取大」。欲行是術。必先得二元。曰「甲」。曰「乙」。乃行是術曰。
若「甲」大於「乙」者。乃得「甲」。
若非。乃得「乙」。也。
是謂「取大」之術也。
但是这无法保证「甲」和「乙」类型相同,在更复杂的情形中,也无法保证返回值和「甲」和「乙」的类型都相同。
不过,鉴于wenyan是编译为其他语言再运行的,不是直接运行的,所以这样严格的类型检查可能不是非常必须。
若想在wenyan中实现泛型,要么需要支持将类型作为参数传递,如javascript中的List(Number)(这其实还涉及到类定义,现在的wenyan还不支持);要么需要支持C++这样的模版语法。
多方法函数
在javascript中,如果将一个函数定义两次,那么只有后面的一个定义会生效。但是,在julia中,“函数”和“方法”是两个概念。同一个函数可以有多个方法(可以理解成“执行函数的方法”),分别适用于不同的参数类型。比如我们可以先定义add(int, int),再定义add(array, array),然后add函数就可以分别适用于两个整型参数和两个数组参数的情况了。在文言中,也许我们可以添加如下机制:
吾有一術。名之曰「相加」。欲行是術。必先得二數。曰「甲」。曰「乙」。乃行是術曰。
加「甲」以「乙」。乃得矣。
是謂「相加」之術也。
吾有一術。名之曰「相加」。欲行是術。必先得二列。曰「甲」。曰「乙」。乃行是術曰。
銜「甲」以「乙」。乃得矣。
是謂「相加」之術也。
这样就定义了函数「相加」的两个方法,分别适用于两个整型参数和两个数组参数的情况。但是,由于目前wenyan编译的时候遇到吾有一術就直接翻译成函数,所以最终的结果和javascript一样,只有后面的定义会生效。
物
目前wenyan的object语法有一些弊端。在物的声明和赋值中,
物之「「甲」」者。數曰三。
得到javascript:
"甲": 3,可如果我想实现:
"甲": 乙[2],要是写
物之「「甲」」者,元曰「乙」之三。
就会得到
"甲": 乙,要是想要写出
"甲": function(a, b) {
return a + b;
},那么
物之「「甲」」者。術曰......嗚呼!
不能实现。必须在物的外部先写好函数,再在物内引用,比较复杂。
如果对象中包含方法,那么方法将无法操作对象的其他属性。因为对象的方法也是该对象的一个部分,要想操作该对象的另一部分,就需要用this指代该对象本身,可目前wenyan中并不支持this。
可以说,目前wenyan的物还并不完善,对属性值的非字面量形式支持不够充分(以函数返回值作为属性值、以列或物中的值作为属性值都不支持,只支持通过简单的标识符或者字面量赋值),对对象方法的支持尤其不充分,既无法在对象内部写方法,也无法通过方法操作对象中的其他属性。javascript中的class就是基于object实现的,如果不能将上述的语法弊端很好地解决的话,就无法写出wenyan自己的class literal(基于物的类),只能套用ECMAScript 6中的class语句了。
总结
wenyan作为少有的用中文编程的语言,作为唯一一个用文言文编程的语言,语言特性是极其重要的。但是,在注意语言特性的时候,也要注意语法的合理性和便捷性,以免语法出现漏洞。虽说鱼和熊掌不可兼得,但是我们可以今天烤鱼,明天炖熊掌啊!