计划出之语言和一些细节要吐槽

本人开了一个说了算:开发同派别语言。

当时是众coder的巴,但惟独来良少人才能当真做出来,做下后就出异常少人会真的使即时宗语言。

吁不要以此间说语言就多了,做了呢是白做之类的说话,反正浪费之免是若的时刻。


我已经确认在技术水平上这个语言是完全可以做出来的。语言最后一定会做出来的。

发表此文的目的,是为了在语言设计完成前参考下各位coder的意见,

作为一个coder,你一定想过自己做一个语言,只是你可能不会做,不敢做,或者没时间,或者觉得做这个零回报。

但是你可以在这里把你关于语言(特别是语法)的想法说出来,如果真的是不错的想法我会采纳你的意见。

当然你不会在你的工作中使用这门语言,不过纯吐槽吐槽不也是挺好的么。

~

事先说自只要举行的言语的横特点:1. C风格,更契合C++用户之惯。2.
强类型、需要编译执行。3. 好编译为原本生机器码,当然GC之类的啊是会见有些。

言语的筹划目标不是大周转效率,也未是略稳定到。而是:做事情需再也有益于。

~~~~~~

连通下去便当下早就筹划好之语法和吐槽点了。欢迎提供建议与批评。

同、基本组织

  1. 全局下只能有:全局函数、全局变量、名字空间及类。程序入口函数默认是
    main 函数。 hello world 代码如下:

    void main(){

       System.Console.writeLine("hello world");
    

    }

里头,System 是系统包。对于代码中之所有点都足以概括,代码如下:

using System;
void main(){
      Console.writeLine("hello world");
}

还还是:

using System.Console;
void main(){
      writeLine("hello world");
}
  1. 代码中支持C中经典的预处理符,但是未允 #define a b
    的款式,因为这东西会于代码非常难以读懂。所以还要 #ifdef 之类的也改成成为了
    #if 。也没有#include
    ,因为这东西被编译速度急剧下降。其实这些状况及C#一齐同。

仲、语句和表达式

  1. 代码允许缺少分号,只要不出新歧义。还有 if for
    等话的小括号呢可以简单,只要非出新歧义。

  2. switch
    语句case之间不贯,这意味着不待break。相同处理情况的case可以行使一个case,然后后面表达式逗号隔开。

  3. 应用以及JavaScript相同的 for in 语句子(内部用 yield
    语词)。同时还支持下语法:

    for(object value, int i in arr){}
    for(int i = 0 to 100){}

    until(a){} // 即 while(!a)
    do {} until(a) // 即 while(!a)

    loop {} // 死循环
    loop(100){} // 循环100次

  4. 自动识别类型。

    auto i = 1; // 自动识别 auto 到 int
    dynamic j = 1; // 动态类型

    // 注意上述两者是本质区别的,前者是静态类型,编译时即便都了解路了,后者动态

    var k = 1; // 智能的种类判断,如果 k 在生命周期内仅出一个类,那么其是静态类型,相当给 auto 了。否则,k有多个类型或者的话,即 dynamic 。

  5. 下 dispose 来刑释解教外部资源

    var s = new FileStream(“C:\a.txt”);
    s.dispose(); // 释放s所占据的资源(但s对象自我肯能是叫GC管理而从不自由的)

    // 也堪行使语法糖写成:

let(var s = new FileStream("C:\\a.txt")){}
  1. 类型转换问题

    int a = 1 as long // 即C的 int a = 1L;
    int b = a as long // 即C的 int a = (long)b;

    int c = “111” as int
    string d = 1 as string; // 可见不设有 .toString() 函数。(as 操作同样可以采用参数)

    // 对于阳项目的变量定义。可以直接省略 as 调用
    string s = 1; // 省不怎么一个 as string

    // 但是任何地方是匪允许省略的。
    // 类型转换也得以用是语法糖:
    int(“111”) // 等效于 “111” as int

    // 类型转换也存在和C一样的隐式方式。

  2. 指南针问题

语法上不直接提供指针功能,同时用类API的不二法门下:

int i = 0;
Ptr<int> pi = i as Ptr<int>;
int j = pi++.value;
  1. 变量约束

    int i : i > 5 ;
    i = 4; // 运行时错: i 必须高于 5

运变量约束好大幅增多代码的平安。变量约束同样可以应用在参数和字段。

  1. 衍生类型

    int[] p = [1, 2, 3];

    int? p = null // 可空类型
    string! p = null // 不可空类型(此代码运行时报错)

    // ? 和 ! 是少种植相反的奇类别, ?适于值类型, !适于引用类型。

  2. 利用类名来得到项目我并为此来照

    Type s = String; // 直接沾此类型本身
    Method d =String.replace; // 直接归此函数本身
    string ns = d.call(“”, “a”, “b”);

  3. 模板字符串

    int i = 1;
    string s = v is $i // 最后 v is 1

  4. 支持 goto

三、类

  1. class 都是引用类型。 struct 都是组织类型。

  2. 默认 public, 名字以 _ 前缀的默认 private

3.  interface 可以蕴涵默认的落实。

  1. 容动态扩展类成员。

  2. 没析构函数。(提升 GC 的频率)

 

求不要说这些事物不抱面向对象。我压根没打算做面向对象,我开的是原创的面向接口。

  1. 支持函数动态重载。

    class A{}
    class B:A{}
    class C:A{}

    // 定义动态重载
    void fn(case B i){}
    void fn(case C i){}

A a = getA();
fn(a); // 调用动态重载

// 如果没有 case ,那么是静态重载。此时因为不存在  fn(A i) 所以报错。
// 但是有 case证明动态重载,那么fn在运行时选择真正函数  。
  1. 下 base 表示基类。内部类不能够一直看外部类非静态成员。

 

 

 

 

附 Object 类源码:

class Object {

    protected Object memberwiseClone(){
        return Native.memberwiseClone(this);
    }

    protected virtual void finalize(){

    }

    Type getType() {
        return Native.getType(this);
    }

    virtual int getHashCode() {
        return Native.getHashCode(this);
    }

    virtual as String {
        return this.type as String;
    }

    as void* {
        return Native.getPtr(this);
    }

    virtual bool == (Object value) {
        return Object.referenceEquals(this, value);
    }

    virtual >> {
        >> this as String;
    }

    static bool referenceEquals(Object objA, Object objB) {
        return Native.referenceEquals(objA, objB);
    }

}

 

 

 

接补充。

string