陳鍾誠 | 教材 | 程式 | 文章 | 網站



範例


  • forTest.c3
  • sum = 0;
    for (i=0; i<=10; i++)
      sum = sum + i;
    

  • forEachRangeTest.c3
  • sum = 0;
    foreach (i in 1..10)
      sum = sum + i;
    

  • test99.c3
  • for (i=1; i<=9; i++)
      for (j=1; j<=9; j++)
        println(i, "*", j, "=", i*j);
    

  • EditorMenu.c3
  • use c3.windows;          // 加入 windows 的領域知識。 if Create a Control, then add the Control into it's Parent.
    						 // 做法 : redefine Control.new() to Controls.add(Control.new());
    
    Window Editor { file = ""; textBox = TextBox(); Menu FileMenu { Menu OpenFile { bgcolor = "#ffffff"; void onClick() { file = FileDialog.Choose(); debug(file, 3*5+i-k); return file; } } Menu NewFile { void onClick() { IO.textToFile(textBox.text, file); textBox.text = ""; } } } }

    translate EditorMenu.c3 (C3) to EditorMenu.cs (C#)
    class Editor : Window {
      String file = "";
      TextBox textBox = new TextBox();
      FileMenu FileMenu1 = new FileMenu();
      Editor() {
        add(file1);
        add(TextBox);
      }
    }
    
    class FileMenu : Menu { File file; OpenFile OpenFile1 = new OpenFile(); NewFile NewFile1 = new NewFile(); FileMenu() { add(OpenFile1); add(NewFile1); } }
    class OpenFile : Menu { OpenFile() { bgcolor = "#ffffff"; } void onClick() { String file = FileDialog.Choose(); debug(file, 3*5+i-k); return file; } }
    class NewFile : Menu { void onClick() { file.save(textBox.text); textBox.text = ""; } }

  • stack.c3
  • class stack {
      items = []
      push(o) { items.append(o); }
      pop() { return items.removeLast(); }
    }
    
  • listTest.c3
  • <code> a = [ 1 "hello" 3.12 [ 2 3 4] ] foreach (o in a) print(o);

  • rewriteTest.c3
  • #define rewrite(Matrix) { = ([ .* ]); to = new Matrix((?1)); ' = .transpose()
  • ([^\.;]+) = .mult((?1))
  • }
    #include rewrite(Matrix) { a = 1 2] [3 4; b = 4 3] [2 1; c = a * b * a'; }
    expand { a = new Matrix(1 2] [3 4); b = new Matrix(4 3] [2 1); c = a.mult(b).mult(a.transpose()); }

    設計原則


    1. Member Function 就是零個參數的 Member 。 2. foreach (o in c) { ... } 3. XXX a.b().c >> var; f(var) ; XXX 4. Object obj id { obj id=new() {..} obj id; ... } 5. try {...} catch (...)? {...}; 6. Anonymous Typing : var person = new {FirstName = "John", LastName = "Smith"}

    C3 : BNF Syntax

    keywords = if, for, while, else, foreach, class, return, yield, rename, null, and, or, not, public, private, protected, static, new
    baseType = int, float, byte, char, string, 
    pre_op1  = + - ! 
    op2      = + - << >> && || and or
    op2mul   = * /
    post_op1 = ++ --
    assign_op= =  <- ->
    pair     = { } [ ] ( )
    attribute= public ,private, protected, static
    types    = id, number, string
    

    BNF														FIRST							FOLLOW
    PROG	= BASE_LIST										FIRST(BASE)						\0
    BASE_LIST = { BASE }									FIRST(BASE)						FOLLOW(BASE)
    BASE 	| IF | FOR | FOR_EACH | WHILE | TRY	 			FIRST(BASE)						} \0
    		| RETURN | YIELD | RENAME
            | BLOCK | CLASS | OBJ | METHOD 
            | INC ; | EXP_LIST ; | ASSIGN ;
    IF      = if (EXP) BASE { else IF } [else BASE]			if								FOLLOW(BASE)
    FOR		= for (ASSIGN; EXP; INC) BASE					for								FOLLOW(BASE)
    FOR_EACH= foreach (id in EXP) BASE						foreach							FOLLOW(BASE)
    WHILE   = while (EXP) BASE								while							FOLLOW(BASE)
    TRY		= try BLOCK { catch '(' MEMBER ')' BLOCK }			try							FOLLOW(BASE)
    BLOCK 	= '{' BASE_LIST '}'								{								FOLLOW(BASE)
    CLASS   = class id is MEMBER BLOCK						class							FOLLOW(BASE)
    OBJECT	= MEMBER [id] BLOCK								id id							FOLLOW(BASE)
    METHOD  = MEMBER id '(' EXP_LIST ')' BLOCK				id (							FOLLOW(BASE)
    INC		= MEMBER OP_INC									id								) ;
    ASSIGN  = MEMBER_LIST = EXP_LIST						id =							;
    MEMBER_LIST = [MEMBER] { , MEMBER }						id								= 
    EXP_LIST= [EXP] { , EXP }								FIRST(EXP)						) ;
    EXP   	= PRE_OP1 MEXP | MEXP { OP2 MEXP}				number string id PRE_OP1 (		POST_OP1 ) ; ,
    MEXP    = ( EXP ) |  ITEM { OP2_MUL ITEM }				number string id (				OP2 ) ;
    ITEM	= MEMBER | CALLS | LIST							number string id				OP2_MUL ) ;
    		| number | char | string				
    ORDER   = CALLS | MEMBER | number | char
    LIST    = '[' { ITEM } ']'
    RANGE   = ITEM .. ITEM
    CALLS   = ONE_CALL { . ONE_CALL }						id								POST_OP1 OP2 ) ;
    ONE_CALL= id ['(' EXP_LIST ')']							
    
    MEMBER = id { . id } id id = OP_INC { ) , RETURN = return EXP_LIST; return }
    ?MAPPING = ITEM : ITEM ?YIELD = yield EXP_LIST ; yield FOLLOW(BASE) ?RENAME = rename id=id ; rename FOLLOW(BASE) ?THROW = throw MEMBER; ?USE = use id MEMBER;

    Preprosessor
    MODULE  = module [\w.]* '{' [^\{]? '}'
    INCLUDE = include [\w.]*;
    REWRITE = rewrite [\w.]* '{' RULE_LIST '}'
    RULE_LIST = RULE { ; RULE }
    RULE    = '{' regexp => toexp }
    


    參考文獻

  • Comparison_of_programming_languages
  • Visual_Prolog
  • *Windows_PowerShell


    作者:陳鍾誠 E-mail:ccc@kmit.edu.tw - 歡迎複製、修改、但作品必需上網分享給大家。
    Creative Commons License

    本著作係採用創用 CC 「姓名標示─相同方式分享 2.5 台灣版」授權條款釋出。

    免費電子書 | 程式百科 | 大學課程網 | 手機入口網 | 百川搜尋網