1. 程式人生 > >今天使用新的feature為Vczh Free Script 2.0寫了一個collection庫

今天使用新的feature為Vczh Free Script 2.0寫了一個collection庫

    自從可以過載除了賦值以外的所有操作符以後,我突然發現原來【將自己寫的容器跟foreach語句結合】這個目標自動實現了。這次寫了一些東西,先貼個使用的程式碼。

    Collection庫裡面的所有容器都實現了操作符過載,Set容器更是過載了+、-、*、>、<、>=、<=、==和!=。所有容器都過載了#(用於獲取長度的單目字首操作符)和[](類似於C++的operator[])。

    這份程式碼使用Collection.FreeMap弄了一個可以自動新增類成員的表,可以大大簡化一些操作。雖然實際上可能並不是很常用,整個Collection裡面,只有FreeMap是用來做廣告的。嘿嘿。
 1 _run(_global,readfile(apppath++"Collections.free"));
 2 using Collections;
 3  4 Print=func(m)
 5 {
 6 internal=multifunc
 7     {
 8         func({value}name,{value}v,prefix)
 9         {
10             writeln(prefix,name,"=",v);
11         }
12         func({value}name,{FreeMap}m,prefix)
13         {
14             writeln(prefix,name," {");
15 for(k in m.__Keys())
16 internal(k,_getvar(m,k),prefix
++"");
17             writeln(prefix,"}");
18         }
19         func(name,unknown,prefix)
20         {
21             writeln(prefix,name,"=<UNKNOWN>");
22         }
23     };
24 internal("a",m,"");
25 };
26 27 a=FreeMap.new();
28 a.Name="IDE Set";
29 a.VC.Language="C++";
30 a.VC.Owner="Microsoft";
31 a.Delphi.Language
="Object Pascal";
32 a.Delphi.Owner="Codegear";
33 a.Print=func(this)
34 {
35 return func()
36     {
37         Print(this);
38     };
39 }(a);
40 41 a.Print();     以下是輸出的結果:  1 a {
 2     Delphi {
 3         Language=Object Pascal
 4         Owner=Codegear
 5     }
 6     Name=IDE Set
 7     Print=<UNKNOWN> 8     VC {
 9         Language=C++10         Owner=Microsoft
11     }
12 }     最後就是整個Collection庫的程式碼了,一共1463行,全部使用Vczh Free Script 2.0實現。    1 /**********************************************************
   2 異常:
   3     OutOfRangeExpcetion                :越界
   4     KeyNotFoundException                :鍵不存在
   5     EmptyContainerExpcetion            :空容器異常
   6 List:列表
   7     constructor()                        :構造空列表
   8     constructor({array}Array)            :根據陣列構造列表
   9     Data()                            :獲得內部陣列
  10     Add(Object)                        :新增物件
  11     AddDistinct(Object)                    :新增不重複的物件
  12     AddArray({array}Array)                :新增陣列中的物件
  13     AddArrayDistinct({array}Array)        :新增陣列中的物件
  14     Insert(Index,Object)                :插入物件
  15     InsertDistinct(Index,Object)            :插入不重複的物件
  16     InsertArray(Index,{array}Array)        :新增陣列中的物件
  17     InsertArrayDistinct(Index,{array}Array)    :新增陣列中的物件
  18     Remove(Index)                    :刪除指定位置的物件
  19     Remove({array}Indices)                :刪除指定位置的一些物件
  20     Remove(Index,Count)                :刪除指定部分的物件
  21     RemoveIf(Predicate)                :刪除滿足條件的物件
  22     RemoveObject(Object)                :刪除物件
  23     RemoveObjectAll(Object)            :刪除指定物件的等價物件
  24     RemoveObjects({array}Array)            :刪除一些物件
  25     RemoveObjectsAll({array}Array)        :刪除指定的物件陣列的等價物件
  26     Clear()                            :刪除全部物件
  27     IndexOf(Object)                    :尋找物件的第一個
  28     IndicesOf(Object)                    :尋找物件的所有位置
  29     Exists(Object)                        :檢查物件是否存在
  30     __getelem__(Index)                :根據位置獲得物件
  31     __setelem__(Index,Value)            :根據位置設定物件
  32     __len__()                            :求長度
  33 SortedList:有序列表
  34     constructor()                        :構造空列表
  35     constructor({array}Array)            :根據陣列構造列表
  36     Data()                            :獲得內部陣列
  37     Add(Object)                        :新增物件
  38     AddDistinct(Object)                    :新增不重複的物件
  39     AddArray({array}Array)                :新增陣列中的物件
  40     AddArrayDistinct({array}Array)        :新增陣列中的物件
  41     Remove(Index)                    :刪除指定位置的物件
  42     Remove({array}Indices)                :刪除指定位置的一些物件
  43     Remove(Index,Count)                :刪除指定部分的物件
  44     RemoveIf(Predicate)                :刪除滿足條件的物件
  45     RemoveObject(Object)                :刪除物件
  46     RemoveObjectAll(Object)            :刪除指定物件的等價物件
  47     RemoveObjects({array}Array)            :刪除一些物件
  48     RemoveObjectsAll({array}Array)        :刪除指定的物件陣列的等價物件
  49     Clear()                            :刪除全部物件
  50     IndexOf(Object)                    :尋找物件的第一個
  51     IndicesOf(Object)                    :尋找物件的所有位置
  52     Exists(Object)                        :檢查物件是否存在
  53     __getelem__(Index)                :根據位置獲得物件
  54     __len__()                            :求長度
  55 Stack:堆疊
  56     constructor()                        :構造空堆疊
  57     constructor({array}Array)            :根據陣列構造堆疊
  58     Data()                            :獲得內部陣列
  59     Push(Object)                        :推入堆疊
  60     Pop()                            :彈出堆疊
  61     Top()                            :返回棧頂
  62     Clear()                            :刪除全部物件
  63     IndexOf(Object)                    :尋找物件的第一個
  64     IndicesOf(Object)                    :尋找物件的所有位置
  65     Exists(Object)                        :檢查物件是否存在
  66     __getelem__(Index)                :根據位置獲得物件
  67     __len__()                            :求長度
  68 Queue:佇列
  69     constructor()                        :構造空列隊
  70     constructor({array}Array)            :根據陣列構造列隊
  71     Data()                            :獲得內部陣列
  72     Enquque(Object)                    :推入列隊
  73     Dequque()                        :彈出列隊
  74     Top()                            :返回列隊頂
  75     Clear()                            :刪除全部物件
  76     IndexOf(Object)                    :尋找物件的第一個
  77     IndicesOf(Object)                    :尋找物件的所有位置
  78     Exists(Object)                        :檢查物件是否存在
  79     __getelem__(Index)                :根據位置獲得物件
  80     __len__()                            :求長度
  81 Set:集合
  82     constructor()                        :構造空列表
  83     constructor({array}Array)            :根據陣列構造列表
  84     Data()                            :獲得內部陣列
  85     Add(Value)                        :新增物件
  86     AddArray({array}Array)                :新增陣列中的物件
  87     Remove(Value)                    :刪除物件
  88     RemoveIf(Predicate)                :刪除滿足條件的物件
  89     Clear()                            :刪除全部物件
  90     Exists(Value)                        :檢查物件是否存在
  91     __len__()                            :求長度
  92     __getelem__(Index)                :根據位置獲得物件
  93     __add__({Set}a,{Set}b)                :並
  94     __mul__({Set}a,{Set}b)                :交
  95     __sub__({Set}a,{Set}b)                :差
  96     __lg__({Set}a,{Set}b)                :a包含b
  97     __sm__({Set}a,{Set}b)                :b包含a
  98     __elg__({Set}a,{Set}b)                :a包含或等於b
  99     __esm__({Set}a,{Set}b)                :b包含或等於a
 100     __equ__({Set}a,{Set}b)                :a與b相等
 101     __neq__({Set}a,{Set}b)                :a與b不相等
 102 ReadonlyList:只讀列表
 103     constructor({List}List)                :構造只讀表
 104     constructor({SortedList}List)            :構造只讀表
 105     constructor({ReadonlyList}List)        :構造只讀表
 106     constructor({Stack}List)                :構造只讀表
 107     constructor({Queue}List)                :構造只讀表
 108     constructor({Set}List)                :構造只讀表
 109     constructor({array}List)                :構造只讀表
 110     Container()                        :內部容器
 111     Internal()                            :內部資料,如果使用陣列建立ReadonlyList的話則返回一個數組
 112     Data()                            :內部陣列
 113     IndexOf(Object)                    :尋找物件的第一個
 114     IndicesOf(Object)                    :尋找物件的所有位置
 115     Exists(Object)                        :檢查物件是否存在
 116     __getelem__(Index)                :根據位置獲得物件
 117     __len__()                            :求長度
 118     Clone()                            :構造跟構造時的輸入同類型的表的ReadonlyList包裝
 119     Map(Transformer)                    :Clone後把列表中的所有東西使用Transformer轉換
 120     Filter(Predicate)                    :Clone後保留通過Predicate的物件
 121     All(Predicate)                        :看是否所有物件都能通過Predicate
 122     Any(Predicate)                        :看是否存在能通過Predicate的物件
 123     Find(Predicate)                    :返回所有能夠通過Predicate的物件的位置
 124     Get(Indices)                        :Clone後保留Indices中指定的物件
 125     FoldLeft(Operand,Operator)            :使用Operator對Operand++List進行左結合計算
 126     FoldRight(Operand,Operator)            :使用Operator對Operand++List進行右結合計算
 127 MapPair:鍵值對
 128 Map:表
 129     constructor()                        :構造空表
 130     constructor({List}Pairs)                :通過MapPair列表構造表
 131     Keys()                            :獲得鍵表
 132     Values()                            :獲得值表
 133     Pairs()                            :獲得鍵值表
 134     Add(Key,Value)                    :新增項
 135     Remove(Key)                        :刪除項
 136     RemoveIf(Predicate)                :刪除滿足條件的物件,使用MapPair進行驗證
 137     Clear()                            :刪除全部物件
 138     Exists(Key)                        :檢查鍵是否存在
 139     __getelem__(Key)                    :根據鍵獲得值
 140 MultiMap:多值表
 141     constructor()                        :構造空表
 142     constructor({List}Pairs)                :通過MapPair列表構造表
 143     Keys()                            :獲得鍵表
 144     Values()                            :獲得值表
 145     Pairs()                            :獲得鍵值表
 146     Add(Key,Value)                    :新增項
 147     AddDistinct(Key,Value)                :新增不重複項
 148     Remove(Key)                        :刪除值的所有項
 149     RemovePair(Key,Value)                :刪除指定項
 150     RemovePairAll(Key,Value)            :刪除與指定項等價的所有項
 151     RemoveIf(Predicate)                :刪除滿足條件的物件,使用MapPair進行驗證
 152     Clear()                            :刪除全部物件
 153     Exists(Key)                        :檢查鍵是否存在
 154     Exists(Key,Value)                    :檢查鍵值是否存在
 155     __getelem__(Key)                    :根據鍵獲得值
 156 FreeMap:自由物件,使用“.”而不是“[]”來獲取表的物件
 157     constructor()                        :構造空表
 158     __get__(Name)                    :獲取物件
 159     __set__(Name,Value)                :設定物件
 160     __Keys()                            :獲取物件名錶
 161     __Exists(Name)                    :檢查物件是否存在
 162     __Remove(Name)                    :刪除物件
 163     其他                            :直接訪問物件
 164 **********************************************************/ 165 Collections=namespace 166 {
 167 fixed OutOfRangeException=class()
 168     {
 169         local Message="";
 170         local constructor=func({value}m)
 171         {
 172             Message=m;
 173         };
 174     };
 175 fixed KeyNotFoundException=class()
 176     {
 177         local Message="";
 178         local constructor=func({value}m)
 179         {
 180             Message=m;
 181         };
 182     };
 183 fixed EmptyContainerException=class()
 184     {
 185         local Message="";
 186         local constructor=func({value}m)
 187         {
 188             Message=m;
 189         };
 190     };
 191  192 /**********************************************************
 193 List
 194 **********************************************************/ 195  196 fixed List=class()
 197     {
 198         local Data=null;
 199         local Add=null;
 200         local AddDistinct=null;
 201         local AddArray=null;
 202         local AddArrayDistinct=null;
 203         local Insert=null;
 204         local InsertDistinct=null;
 205         local InsertArray=null;
 206         local InsertArrayDistinct=null;
 207         local Remove=null;
 208         local RemoveIf=null;
 209         local RemoveObject=null;
 210         local RemoveObjectAll=null;
 211         local RemoveObjects=null;
 212         local RemoveObjectsAll=null;
 213         local Clear=null;
 214         local IndexOf=null;
 215         local IndicesOf=null;
 216         local Exists=null;
 217         local __len__=null;
 218         local __getelem__=null;
 219         local __setelem__=null;
 220  221         local constructor=func()
 222         {
 223             local Items=[];
 224  225             Data=func()
 226             {
 227 return Items;
 228             };
 229  230             Add=func(Object)
 231             {
 232                 Items[#Items:0]=[Object];
 233 returnthis;
 234             };
 235  236             AddDistinct=func(Object)
 237             {
 238 if(!Exists(Object))
 239                     Add(Object);
 240 returnthis;
 241             };
 242  243             AddArray=func({array}Array)
 244             {
 245                 Items[#Items:0]=Array;
 246 returnthis;
 247             };
 248  249             AddArrayDistinct=func({array}Array)
 250             {
 251 for(i in Array)
 252                     AddDistinct(i);
 253 returnthis;
 254             };
 255  256             Insert=func({int}Index,Value)
 257             {
 258 if(Index<0|| Index>#Items)
 259 throw(OutOfRangeException.new("下標越界,長度:"++#Items++",下標:"++Index++""));
 260                 Items[Index:0]=[Value];
 261 returnthis;
 262             };
 263  264             InsertDistinct=func({int}Index,Value)
 265             {
 266 if(Index<0|| Index>#Items)
 267 throw(OutOfRangeException.new("下標越界,長度:"++#Items++",下標:"++Index++""));
 268 if(!Exists(Value))
 269                     Items[Index:0]=[Value];
 270 returnthis;
 271             };
 272  273             InsertArray=func({int}Index,{array}Value)
 274             {
 275 if(Index<0|| Index>#Items)
 276 throw(OutOfRangeException.new("下標越界,長度:"++#Items++",下標:"++Index++""));
 277                 Items[Index:0]=Value;
 278 returnthis;
 279             };
 280  281             InsertArrayDistinct=func({int}Index,{array}Value)
 282             {
 283 if(Index<0|| Index>#Items)
 284 throw(OutOfRangeException.new("下標越界,長度:"++#Items++",下標:"++Index++""));
 285 for(i in Value)
 286 if(!Exists(i))
 287                     {
 288                         Items[Index:0]=[i];
 289                         Index=Index+1;
 290                     }
 291 returnthis;
 292             };
 293  294             Remove=multifunc
 295             {
 296                 func({int}Index)
 297                 {
 298 if(Index<0|| Index>=#Items)
 299 throw(OutOfRangeException.new("下標越界,長度:"++#Items++",下標:"++Index++""));
 300                     Items[Index:1]=[];
 301 returnthis;
 302                 }
 303                 func({array}Indices)
 304 

相關推薦

今天使用featureVczh Free Script 2.0一個collection

    自從可以過載除了賦值以外的所有操作符以後,我突然發現原來【將自己寫的容器跟foreach語句結合】這個目標自動實現了。這次寫了一些東西,先貼個使用的程式碼。    Collection庫裡面的所有容器都實現了操作符過載,Set容器更是過載了+、-、*、>、<、>=、<

今天發現Vczh Free Script 2.0一個bug

    今天抓到了一個隱藏了3個月的bug。這個bug以前一直沒有被找到,因為以前寫的用於測試指令碼的程式碼都沒有出現類成員函式使用非全域性的外部物件的情況。Vampire.Kiss用我的Vczh Free Script 2.0代替PHP開發了一個網站,過程中也向我提了不少要求。其中有一個就是想在

Vczh Free Script 2.0 beta 釋出

點選這裡下載。作者保留對原始碼的一切權利檔案是一個rar壓縮包,結構如下:【產品】    【Demo】兩個Demo的編譯結果。這個資料夾裡面的指令碼程式碼僅供測試用。    【庫】編譯結果以及Vczh Free Script 2.0提供的外掛封裝,使用Vczh Free Script指令碼語言編寫

Vczh Free Script 2.0中namespace和大部分操作符過載完成!

    今天上完課回來繼續把昨天晚上剩下的using字句完成。使用Syngram寫編譯器真是舒服啊,直接在程式碼裡面加兩條推導式就完成了。昨天發現了InsertEnv指令的bug以後,改過來了。不過InsertEnv不能用在using身上,只好另外寫了一個UsingEnv指令,把環境以及上游的連結

Vczh Free Script 2.0的Syngram完成

    今天在測試封裝在FreeScript內的正則表示式介面的時候發現了一個垃圾收集器的Bug,不過很容易就看出來了,於是立刻fix掉。出錯的原因在於垃圾收集的時候只標記了運算堆疊的內容,忘了標記呼叫堆疊的內容。    這個新的Syngram包含了三個工具,分別是正則表示式、詞法分析器和語法分析

Vczh Free Script 2.0 最新.NET介面完成!

    依然是上一篇文章的程式,換了C#寫。    在Vczh Free Script 2.0的接口裡面,我力求讓C++和.NET兩種語言的介面都趨於一致。目前達到了這個目標,C#僅僅比C++多了兩個輔助函式。外掛那一部分是相當難寫啊。Vczh Free Script 2.0的C++介面允許外掛和

郝同學一次通過華HCIE面試,2.0時代末期的戰報

指導 匯聚層 多條 鏈路 分鐘 應該 端口 abr 實現 考試題目1.二層和三層環路有什麽特點和區別2.園區網的網關部署在接入層還是匯聚層3.雙點雙向重分發 到考場和考官打聲招呼,在考官的指導下登錄考試系統給你三分鐘時間準備下題目,然後開始答題(沒有做自我介紹,準備好後直接

警示:一個AIX上11.2.0.4版本定製的Bug正在高發

有這麼一個Bug,僅在AIX平臺上,Oracle Database 11.2.0.4的版本中出現,在12.1中被修復,之前和之後都不存在,所以簡直是為這一版本定製的。 之前一些客戶零星的遇到這個問題,而在2017年最近的幾個月,幾個客戶接連遇到這個問題,所以我想還是寫下這篇文章,作為一個提示。 這個

ffmpeg編譯libaacplus-2.0.2

wiki: How to quickly compile libaacplus ​HE-AAC audio v2 (with SBR + PS) is the superb audio encoder used to encode high qu

CCF-棋局評估 201803-04(版本 2.0)------(之前一個臃腫的1.0版 ,還沾沾自喜 233)

核心 color namespace ace for play class 一個 while 核心 : 博弈搜索樹    雙方得分互為相反數    dfs (x,y,player): 玩家player下完(x,y)之後的得分最大值 易錯: 先判斷輸贏,再判斷

什麽開發人員必須要解數據鎖?

資料 不同的 his 定量 串行 自己 start 文件 並發訪問 原創: 咖啡拿鐵 1.鎖? 1.1何為鎖 鎖在現實中的意義為:封閉的器物,以鑰匙或暗碼開啟。在計算機中的鎖一般用來管理對共享資源的並發訪問,比如我們java同學熟悉的Lock,synchro

最新用WPF觸摸屏一個程序,雙格輸入的

nload size alt wpf 一個 ast 點擊 fill fonts 原文:最新用WPF為觸摸屏寫了一個手寫程序,雙格輸入的 雙格輸入可以提高手寫速度,當前字寫完以後

記錄一下今天 一個TreeSet實現日期去重以及排序

Set<String> monthset =new TreeSet<String>(new Comparator<String>(){ public int compare(String s1, String s

asp.net core 2.0中的一個小問題

mva中觀看asp.net core初級視訊,CURD一節中跟著視訊把程式碼敲上去了,發現無法正常執行,提示是NullReferenceException。打了幾個斷點,發現數據已經順利的存入了記憶體資料庫中,不過在Razor模板頁面獲取資料的時候,沒有正確的返回要獲得的資料

FineUIPro/Mvc/Core/JS v4.2.0 釋出(老牌ASP.NET控制元件,WebForms,ASP.NET MVC,Core,JavaScript)!

還記得 10 年前那個稍微青澀的 ExtAspNet 嗎,如今她已脫胎換骨,變成了如下 4 款產品: FineUIPro:基於jQuery的經典款ASP.NET WebForms控制元件,之前的FineUI(開源版)可以直接升級到此版本。 FineUIMvc:支援ASP.NET MVC5。 Fine

今天一個關屏鎖屏的app代替電源鍵短按功能。

我這老手機的電源鍵都快被我按壞了,所以寫這個app來代替電源鍵的短按鎖屏熄屏。這個app首次執行時會要求啟用裝置管理許可權,按提示操作即可,也可以手動啟用它:設定-〉安全-〉裝置管理者,勾上Scree

今天一個簡單的helloworld執行時報錯

今天寫了一個最簡單的helloworld程式,但執行時總是報錯,說找不到類定義。檢查了大小寫都沒錯,注意JAVA在命令列下執行時引數是大小寫敏感的。最後在網上多方搜尋,終於得知罪魁禍首,原來是因為我的.java檔案儲存的

我們一個smartzip的指令碼,該指令碼可以自動解壓bzip2, gzip和zip 型別的壓縮檔案

我們寫了一個名為smartzip的指令碼,該指令碼可以自動解壓bzip2, gzip和zip 型別的壓縮檔案:  #!/bin/bash  ftype="$(file "$1")"  case "$ftype" in  "$1: Zip archive"*)     un

vue 移動端今天一個根據後臺傳過來的http狀態碼,來實現跳轉error頁面

首先是現在main.js裡面進行配置Vue.prototype.$onError = function (error) { var error_msg = '網路錯誤'; var toastFlag = true; switch (error.errorCode) { cas

等保2.0,分享一個可落地的等保建設方案

企業在安全方面最關注的其實是業務安全、資料安全與安全檢查,這篇文章來講解一下我對於等保過檢的經驗與建設。 不同於其他建設文章,本文會給出很多落實方面的建議與方法,希望企業可以通過這篇文章,順利通過過檢任務,並保證安全的投入成本與收益的比率。   一、管理 一個企業的安全性最終體現在管理與