|
@@ -2,61 +2,89 @@ TODO
|
|
|
|
|
|
## Important
|
|
|
|
|
|
+parser change (_list) (s) (more_) convention prefixes/suffixes to (*), (+), etc.
|
|
|
+
|
|
|
+TYPE SYSTEM REFACTOR: (test/ref/ref.km)
|
|
|
+- no subtyping (thus no variance)
|
|
|
+- lift record type def to the same level as enum type def
|
|
|
+- no tuple; type Lambda[Input,Output] native; type Lambda2[Input1,Input2,Output]
|
|
|
+- type Pair[A,B] record { first: A, second: B }
|
|
|
+- update vd go-struct related code (including EnumDummyInterfaceMethod)
|
|
|
+- implicit contexts integrated in arguments (thus have default values)
|
|
|
+type - native; // unit
|
|
|
+type Unknown native;
|
|
|
+type Error implements(Exception) native;
|
|
|
+type Bool union { const No, Yes }; // no as zero
|
|
|
+type Maybe[Some] union { const None, Some };
|
|
|
+type Result[Success,Failure] union { Success, Failure };
|
|
|
+type Source[T] restricted Observable[T]; // Observable no exception parameter
|
|
|
+'a'.[Maybe[String]] // implicit conversion
|
|
|
+value.[Interface] // implicit conversion
|
|
|
+computed.[] // unbox
|
|
|
+type Number restricted Integer;
|
|
|
+new Number(1) // only available in the module of Number
|
|
|
+new Record { ... }
|
|
|
+
|
|
|
+|-+ project
|
|
|
+ |-+ module1
|
|
|
+ | |-- @manifest.vd
|
|
|
+ | |-- foo.km
|
|
|
+ |
|
|
|
+ |-+ module2
|
|
|
+ |-- bar.km
|
|
|
+ |-- baz.km
|
|
|
+
|
|
|
+type #XXX -> type XXX data {record,union}
|
|
|
+
|
|
|
overload: input expr "shape" signature matching
|
|
|
|
|
|
field/case refs to list (xx.(&(branch) => ...))
|
|
|
|
|
|
+repl gui (text browser + line edit, tab completion)
|
|
|
+ - QTextBrowser < QTextEdit::append
|
|
|
+ - display details of large objects in another window
|
|
|
+ - consider full debugger (multiple tabs, console + timeline + source + gui)
|
|
|
+ - debugger (in machine), debugger server, debugger client
|
|
|
+ - reflect::Type, (param T -> Unknown)
|
|
|
+ - reflect::Value (implicit conversion)
|
|
|
+ - debug::Log('state', state)
|
|
|
+
|
|
|
encode, decode, decode*: async version
|
|
|
|
|
|
-type #XXX -> type XXX data
|
|
|
+component function (can have preview)
|
|
|
|
|
|
SQLite (QSqlDatabase) project source storage (exclusive conn, diff the whole db)
|
|
|
|
|
|
-module(can be private/public) < package
|
|
|
+module < project
|
|
|
|
|
|
UUID for each type/const/operator
|
|
|
|
|
|
-package: kvdb (-> gist)
|
|
|
+project: kvdb (-> gist)
|
|
|
content: modules(types,operators), entry point, dependencies, assets, docs
|
|
|
|
|
|
-ctor lambda -> generate default ctor (private) for protected/opaque type
|
|
|
-
|
|
|
-- ui::Input -> ui::TextInput
|
|
|
-- ui::TextView 2-way binding with Mutable[String] relay buffer (details on gist)
|
|
|
-- ListEdit: change mutating flag to relay buffer, similarly
|
|
|
-- Reactive: consider forbidding update(commit) during notification(notify)
|
|
|
-- ui::modal-get-text, ui::TextViewMultiLine, ui::InputMultiLine
|
|
|
-
|
|
|
-consider: type LiteralString protected String;
|
|
|
-
|
|
|
-dynamic cast (CaseRef[Interface,Concrete])
|
|
|
+ui::modal-get-text, ui::TextViewMultiLine, ui::TextInputMultiLine
|
|
|
|
|
|
`interact-with-window` add option `min-size`; `popup` add option `rel-pos`
|
|
|
|
|
|
-revise argument count limit (consider accessing elements in TupleValue directly)
|
|
|
-
|
|
|
-implicit context default values
|
|
|
-
|
|
|
context menu (QMenu.exec)
|
|
|
|
|
|
-consider hook-based event handling
|
|
|
-
|
|
|
var wait = make(chan struct{}) // encapsulate to something in util
|
|
|
|
|
|
qtbinding C side int vs. go side int (not the same type, fix it)
|
|
|
|
|
|
api functions for file dialogs, font dialog, ...
|
|
|
|
|
|
-loader cache: (file-path, modified-time) => AST/asset
|
|
|
-
|
|
|
-"map" operation for homogenous tuple
|
|
|
-
|
|
|
-typeList and functionList: consider sorting by date
|
|
|
-
|
|
|
-consider making `container` module standalone
|
|
|
-
|
|
|
-refactor code of container types after generics available
|
|
|
+merge go118 branch after go1.18 released
|
|
|
|
|
|
+- {prefix,infix,suffix,continuation} operator
|
|
|
+ prefix (op foo)
|
|
|
+ infix (op infix foo)
|
|
|
+ suffix (op method Type.foo)
|
|
|
+ continuation (op control foo)
|
|
|
+ (op const)
|
|
|
+ (op variadic)
|
|
|
+ (op component)
|
|
|
+ (op message)
|
|
|
|
|
|
## IDE Roadmap / Design
|
|
|
|
|
@@ -74,39 +102,10 @@ file {
|
|
|
|
|
|
module can be configured as 'no module prefix' (mod:: not displayed in IDE)
|
|
|
|
|
|
-- {prefix,infix,suffix,continuation} operator
|
|
|
- prefix (function)
|
|
|
- infix (operator)
|
|
|
- suffix (method)
|
|
|
- continuation (control)
|
|
|
-
|
|
|
-export 'b9adcfb3-7830-4092-9fd2-fc414172c774'
|
|
|
-function tick {interval: Number}: Source[unit] {
|
|
|
- // code
|
|
|
-}
|
|
|
-export 'c4dfe913-35f5-46ee-bd46-232d778cffd4'
|
|
|
-method List.length: Number {
|
|
|
- // code
|
|
|
-}
|
|
|
-export '89faeba7-e533-4f72-92db-93aab92c3a40'
|
|
|
-operator + (l: Integer, r: Integer): Integer {
|
|
|
- // code
|
|
|
-}
|
|
|
-export '6e95ceb3-a479-4586-a788-ee9a2284ca1e'
|
|
|
-control await[A,B] (a: Async[A], k: &(A) => Async[B]): Async[B] {
|
|
|
- // code
|
|
|
-}
|
|
|
-
|
|
|
- Browser-like navigation (statement <=> page) (back, forward, recent history)
|
|
|
|
|
|
- Tags for functions/types (tags instead of classes/folders)
|
|
|
|
|
|
-- { Type.method obj-subtype }
|
|
|
-
|
|
|
-- call function with explicit context passing { f(ctx{=:eq}) x }
|
|
|
-
|
|
|
-- no function ref, function -> operator
|
|
|
-
|
|
|
- language-based debug-log (we can know the type)
|
|
|
|
|
|
- sample input (to get a clear preview of the dataflow)
|
|
@@ -120,20 +119,7 @@ control await[A,B] (a: Async[A], k: &(A) => Async[B]): Async[B] {
|
|
|
|
|
|
- API: consider renaming wait and tick
|
|
|
|
|
|
-
|
|
|
-## Reflection
|
|
|
-
|
|
|
-type type[T] protected Type;
|
|
|
-type Type native;
|
|
|
-type value[T] protected Value;
|
|
|
-type Value native;
|
|
|
-|reflect::type[Foo]|
|
|
|
-|reflect::value| "abc"
|
|
|
-// type assertion etc. implemented by (native) functions
|
|
|
-
|
|
|
-
|
|
|
-## API Refactor
|
|
|
-
|
|
|
-- API: revise resource management for files, ... (consider Disposable[T] monad)
|
|
|
+- API: revise resource management for files
|
|
|
+ consider Disposable[T] (ctx-based disposal or persist closable object)
|
|
|
|
|
|
|