Drag語言設計

有虛擬機,跨平臺

drag虛擬機,類似python虛擬機、java虛擬機。

既是靜態語言,又是動態語言。

當類實現dynamic接口時,那麼這個類支持動態添加屬性和添加方法的操作。否則,這個類會在編譯時檢查操作是否合法。

一切皆對象,一切對象皆源於類。

類似去掉java的原生類型。

虛擬機內置類型

Object
DynamicBooleanByteIntegerLongFloatDoubleString
Map
List

區分Float和Double採用數字後面使用_d或_f 區分Integer和Long採用數字後面使用_i或_l

既可以定義引用類型,也可以不定義引用類型

Integer a=10;也可以a=10; 不定義引用類型時,默認是Object類型。

既可以使用{}也可以使用縮進或者兩者混合,但強制代碼縮進。

public class A{    void printString(){
        print("str");
    }
}public class A    void printString()
        print("str");

if和for、swith和while

沒有swith,沒有while

if

//普通版if(){}else if(){}else{}//簡寫版if(){}ef(){}el{}

for

for(Boolean)//類似whilefor(Var;Boolean;Increment)//正常的forfor(Var in Iterator)//類似python

支持goto

goto只能在方法內使用,且只能往後goto到一個標記處。 類似java的break 標籤,但不限於在循環內使用。

[String] ss=["str1","str2"];for(s in ss)    if(s=="str2")
    goto A
print("run...");//這句代碼會被跳過:A//跳到這裏

支持多行字符串代碼編寫方式

String s="ss
sssss
";

註釋

同java,但單行支持#

命名規則

同java,但不能使用$

父類定義的非私有屬性子類不能定義重名的屬性。

進制

默認10進制 2進制:數字開頭使用28進制:數字開頭使用816進制:數字開頭使用16_ 以此類推。

支持返回多個返回值

public static String,Integer getInfo()    return "zs",10;public static main(List s)    String name,Integer age=getInfo();

數組

類似java的list

數組的定義(泛型寫法)List<String> array=new List();//如果在構造方法new List(Integer);傳入參數則可以固定數組長度List<String> array=new List<String>();List<String> array=["str1","str2"];
[String] array=new List();
[String] array=new List<String>();
[String] array=["str1","str2"];
數組的定義(非泛型寫法,效果等於[Object])List array=new List();List array=new List<String>();List array=["str1","str2"];
[] array=new List();
[] array=new List<String>();
[] array=["str1","str2"];

使用:

[String] array=["str1","str2"];
String v=array[0];
String v=map.get(0);

字典

字典的定義(泛型寫法)Map<String:Integer> map=new Map();//如果在構造方法new Map(Integer);傳入參數則可以固定字典長度Map<String:Integer> map=new Map<String:Integer>();Map<String:Integer> map={"key1":10,"key2":20}
{String:Integer} map=new Map();
{String:Integer} map=new Map<String:Integer>();
{String:Integer} map={"key1":10,"key2":20}
字典的定義(非泛型寫法,效果等於{Object:Object})Map map=new Map();Map map=new Map<String:Integer>();Map map={"key1":10,"key2":20}
{} map=new Map();
{} map=new Map<String:Integer>();
{} map={"key1":10,"key2":20}

支持一個key對應多個value

{String:Integer:Integer} map={"key1":10:11,"key2":20:21}

使用:

{String:Integer} map={"key1":10,"key2":20}Integer v=map["key1"];Integer v=map.get("key1");

{String:Integer:Integer} map={"key1":10:11,"key2":20:21}Integer v1,Integer v2=map["key1"];Integer v1,Integer v2=map.get("key1");

普通類

默認一個普通的類就是靜態類(相對於動態類來說)。 定義靜態類型類:

class A{
}

使用靜態類型對象:

A a=new A();
a.name="tzc"//編譯錯誤A沒有a屬性a=new A();
a.name="tzc"//編譯錯誤Object沒有a屬性

接口

使用interface關鍵字定義。

interface A{
}

或者:

interface class A{
}

接口是特殊的類。 方法都是實例的公有的,沒有屬性,必須繼承才能new。

常量類

使用constant關鍵字定義。

constant A{
}

或者:

constant class A{
}

常量類是特殊的類。 屬性、方法都是靜態的,不能被繼承。

終態類

使用final關鍵字定義。

final A{
}

或者:

final class A{
}

終態類是特殊的類。 不能被繼承。

final關鍵字基本同java,但可以有以下用法:

{String:Integer} map=final {"key1":10,"key2":20}//map裏的值不能修改,也不能添加和刪除元素[String] array=final ["str1","str2"]//array裏的值不能修改,也不能添加和刪除元素Student stu=new final Student("zhangsan",20);//stu裏的屬性不能修改,也不能添加和刪除屬性

動態類

使用dynamic關鍵字定義。

dynamic A{//這樣定義表示該類實現Dynamic接口}

或者:

dynamic class A{//這樣定義表示該類實現Dynamic接口}

或者實現Dynamic接口:

class A implement Dynamic{
}

動態類是特殊的類。 能避免編譯類型檢查。

使用動態類型對象:

A a=new A();
a.name="tzc"//編譯並運行正確Dynamic a=new A();
a.name="tzc"//編譯並運行正確a=new A();
a.name="tzc"//編譯錯誤Object沒有a屬性

new時使用dynamic:

class A{
}
a=new dynamic A();//如果A沒有實現Dynamic那麼a是一個實現A並且實現Dynamic的子類的對象,相當於創建了一個匿名類。a.name="tzc"//編譯並運行正確a=dynamic 10;//a是一個繼承Integer並且實現Dynamic的子類的對象a=dynamic String;//a是一個繼承String並且實現Dynamic的子類的對象

可代替javascript在前端瀏覽器使用,需要瀏覽器支持,而開發者只需要導入相應的庫就行了。

API,核心的API只有內置類型,要想開發還得添加不同的庫。

基礎版的API類似JavaSE 高級版的API類似JavaEE


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章