X-Git-Url: https://ocean-lang.org/code/?p=ocean-D;a=blobdiff_plain;f=00-TODO;h=7bd6ddcf819c22b92e486c8b897229e14efefff8;hp=2885baacec2cde04f9d40392964eaf7a5a9a35d2;hb=c39500ef12ffba7114e3084979679940f83658b6;hpb=5a245ff2b74c48d2a50cc8d6f4529ef5abb84837 diff --git a/00-TODO b/00-TODO index 2885baa..7bd6ddc 100644 --- a/00-TODO +++ b/00-TODO @@ -1,74 +1,167 @@ -This is a living document - delete things when done. Avoid discussion. +# This is a living document - delete things when done. Avoid discussion. +## Needs implementations -Current version (Cataract Creek) -- handle free_type more cleanly?? -- change 'labels' to only be created for 'use' -- handle syntax errors better - recover quickly. -- use precedence levels for expressions -- structs - - const fields - - anonymous field - array or struct (or pointer to these) - multiple anon struct ar allowed if they don't conflict - - [] can apply to anon array field - - anon struct field gets fields interpolated +### Current version (Cataract Creek) -- manifest values for arrays and structs [a,b,c] -- yet more operators - << >> # - bit-ops & | ~ &~ - op= -- split values so I can have an array of just the value (1 byte for u8) -- integers, unsigned, bitfield, float -- pointers - - owned or borrowed - - pure, loaded, overloaded, augmented - - owned: once, counted, collected -- array slice -- array buffer - can be added to and grows. -- char, string search, regexp search +- allow type names to be used before declared. Need to re-evaluate all + type sizes after parse. +- resolve the HACK of allowing assign from struct when name starts space. +- '?' prefix operator returns Boolean, index operator for strings. Can be used to + test for end-of-string +- ?? infix operator return LHS if '?' on it would succeed, else RHS +- reference to struct or intrinsic (@foo), with @new, @free, @nil and ? to test +- add [] as size-of-array +- replace [foo::] declaration of array with [] - fix all main() calls -- allow "do stuff" as a stand-alone statement (scope) +### Next Version (Govetts Creek) +- int nat cyc {i,n,c}{8,16,32,64} - maybe not cyc - it needs size. +- ops: # & | ~ &~ - no shift: use (N * #shift) or (N / #shift) +- op= +- enum, with multi-valued names. enum foo { yes, no, many(10) } + bar:foo=.yes; if bar == .no... if ?bar.many: print bar.many, "items" + Maybe .true and .false for Boolean +- change use/case labels in ".name" which creates a local enum if no + type is evident. +- set, with bool or int members. set foo { pinned, memalloc, priority(4) } + bar:foo = .memalloc | .priority(2). if bar.pinned: bar.priority += 1 +- allow global names to be used before they are declared. Assume global + if undeclared, and complain in final analysis. +. array slices - references to arrays +- array access to read bytes from strings. How to get length? "?string[4]" ?? + array[] gets length?? + +### Subsequent version +- 'return' statement similar to 'use', but only valid a function context +- 'return' can take no value when function has inline/transparent return value +- simple methods. Define "func type.name...." and the name will only be visible + within namespace for type. +- optional args for functions - if value given +- named args? Needs to look like manifest structs +- array args - last parameter can collect all remaining as array if attribute 'open' + do I need attribute? Can anything be type compatible with both X and []X ?? +- initial values for return parameters +- convert between string and array-of-cyc8 +- float64 float32 +- transparent fields, parameters which are structs or pointers +- transparent fields which are arrays +- transparent results from functions to have same effect as inline-results +- manifest values for records: [.foo = a, .bar = b] +- manifest values for arrays: [expr = expr, ...] +- constant structure definitions +- const structures can inherit from another, and update select fields. +- 'use' labels *must* appear in case statements. +- 'then' can extend a case section into some other. + +## Needs Design +- union types - how do I want to support these? inheritance with variance? +- lambda +- 'error' value for various types. NIL for pointer NaN for float, extra flag bit + for integers. -MAX_INT ?? +- enum as array index. foo:[:enum]int. foo[.baz] = 23 +- init_only fields +- const fields in structs: like const, but in 'type' namespace, not 'module' +- 'borrowed' and 'owned' attributes for pointers. .free method +- interfaces - list of methods that must be defined +- standard interfaces to access operations: group, field, binary, logical +- modules - exported names in versions, and import lists + on types, fields, constants, etc +- foreach variable-list := make_generator() do + A generator has 'first', 'next' and 'finally' methods + 'first' and 'next' return the same type which is conditional ('?' works) + 'finally' returns some other type - possibly Tnone - which goes to + a set of case at end of loop + +- attributes for fields and local variables + transparent - names inside can be accessed directly + + handled - accesses convert to function calls?? + constant - compile time constant - not stored + stable - ?? + add-only - ?? like append-only. + read-only - set early never changed? + mutable + owned - Can be borrowed and freed + borrowed - There is somewhere this is borrowed from + dependant - ??? + pure - definitely not an error + endian(big,small,pdp) + attributes for whole struct + unsorted - fields appear as written + packed - like unsorted, but no gaps permitted. + +- lambda functions for passing as arg to function. + Are these always there to provide an interface for a value? + Do I want a syntax for functions that just provides a value + func (a:number; b:string):number = a+b[] + +- units for numbers +- iso suffixes for number? +- static variables. Easy to implement, but need a syntax. Something + really loud. +- concurrency + implicit and explict + reference attributes for locks and refcounts etc + RCU + - do/go/run/fork/async complex statement + All local variables accessed in the body are read-only + and copied to a new frame, and code is run in a new thread. + Thread is mostly invisible. It interacts through shared objects, + particularly the caller might create a channel and the thread + might send messages on it. Any interesting handshakes + are mediated by appropriate data structures. + +- arbitrary value asserts tied to variable attributes. + e.g. ranges for value and relationships between fields + These are tested by compiler at any changed. Somehow. + +- expose parse info for editing by code run at compile time. + This allows new attributes to be implemented in app code. + E.g. handling bigendian fields by adding conversion functions. -Next version (Govetts Creek): -- functions and procedures - Finalize what a "main" program looks like. + should argv come from a library (sys.argv), or should environ go to main? -Much later -- per-field attributes - constant, stable, add-only, read-only, mutable, owned, borrowed, dependant, pure -- records -- enum - classes - constructors and destructors - or "after" ?? + destructors, which can be declared inline - vtables, fat pointers, list of approaches -- operators as interface methods - interfaces, inheritance -- modules, imports and exports -- closures, threads, co-routines, generators +- closures, threads, co-routines, generators lamdas +- generics/templates. These should be just a compile-time + decision. Same code can be called with suitable methods passed, or + recompiled in the new context and then optimised. - introspection / reflection ? e.g. support serialization find function given a string holding the name measure coverage, adjust based on performance metrics auto-create mock objects Is this just parsing the details in the obj file? -- % formatting -- string / slice / strbuf -- parsing library - sscanf equiv, regexp, LALR - FFI -- GTK -- sockets / http / HTML - parameterised types, and dependant types - message passing primitives - overloading for numbers - exceptions ?? - ensure list_head type concept can work - "union" type ?? -- pattern matching for destructuring?? -- casts?? -- typeswitch? -- iso suffixes for number? -- foreach? -- case fall-through or go-to -- break/continue or "next","last" -- algebraic types +NO - pattern matching for destructuring?? +- casts to and from "binary". +NO- typeswitch? +- ??? algebraic types + +## Needed in library + - augmented and overloaded pointers + An augmented pointer can also store a flag- for a bitlock etc + An overloaded pointer can alternately store an int - e.g. error code + - garbage collection? + - UTF8 string disection + - search, regexp + - cvt() interface an format() function + - parsing: rexep? LALR? sscan? + - buffered file IO + - auto-growing buffer including strings + - sockets + - http + - html + - gtk? xcb? +