Skip to content

泛型、多方法函数、物、类定义 #595

@GLanguage

Description

@GLanguage

最近一直在写一些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作为少有的用中文编程的语言,作为唯一一个用文言文编程的语言,语言特性是极其重要的。但是,在注意语言特性的时候,也要注意语法的合理性和便捷性,以免语法出现漏洞。虽说鱼和熊掌不可兼得,但是我们可以今天烤鱼,明天炖熊掌啊!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions