Hi Julio, I was asking about how they are using Split string to parse a dot notation path into the value or containing object. Working this out was the real heavy lifting Canon did with his OBJ Module. It wasn't easy using the prior tool set.
I played with it for a couple of hours and have come up with these two methods. I'm sure this can be improved on. First is this method to split a string into a collection of property elements. I also split the collection indices into numbers. BTW - this can also be used to make JSON Pointers. // Method: OBJ_parse_pathToCollection (text) => collection // $1 : dot notation path // $0 : collection of references C_TEXT($1;$path) C_COLLECTION($0;$myCol) C_LONGINT($i;$n) Case of : (Count parameters=0) : (Length($1)=0) Else $path:=Replace string(Replace string($1;"[";".");"]";"") $myCol:=Split string($path;".") For ($i;0;$myCol.length-1) If (Position($myCol[$i][[1]];"0123456789")>0) // starts with a number $myCol[$i]:=Num($myCol[$i]) End if End for End case // -------------------------------------------------------- $0:=$myCol Next is the method to extract the value or containing object of a path from an object or collection. // Method: OBJ_resolve_path (ptr; text) -> object // $1 : an object or collection // $2 : path to value, object or collection to return // $0 : {"success":(null, true or false), "value": (null, object, collection or value)} C_POINTER($1) C_TEXT($2;) C_OBJECT($resultObj;$0) C_LONGINT($i;$n) C_COLLECTION($dataCol;$pathCol) $pathCol:=OBJ_parse_pathToCollection ($2) $resultObj:=New object("success";Null;"value";Null) $dataCol:=New collection($1->) $i:=0 Repeat Case of : (Value type($dataCol[0])=Is collection) // this must be a number Case of : (Value type($pathCol[$i])#Is real) // then this is not valid $resultObj.success:=False TRACE : ((($dataCol[0].length)-1)<$pathCol[$i]]) $resultObj.success:=False : ($i=($pathCol.length-1)) // have reached the target $resultObj.success:=True $resultObj.value:=$dataCol[0][$pathCol[$i]] Else // go on to next property $dataCol.unshift($dataCol[0][$pathCol[$i]]) End case : (Value type($dataCol[0])=Is object) Case of : (($dataCol[0][$pathCol[$i]])=Null) $resultObj.success:=False : ($i=($pathCol.length-1)) // have reached the target $resultObj.success:=True $resultObj.value:=$dataCol[0][$pathCol[$i]] Else // go on to next property $dataCol.unshift($dataCol[0][$pathCol[$i]]) End case End case $i:=$i+1 Until ($i>($pathCol.length-1)) | ($resultObj.success#Null) $0:=$resultObj $resultObj is an approach I'm starting to like a lot. It's the only way to return any kind of value, an object or a collection. The 'success' property is easy to test. This method currently returns 3 success values: true (the path evaluated), false (it doesn't), or null which means it's not valid either. I decided to use a pointer because I wanted to not have to determine the object type prior to calling the method - plus there would be two of them. Like I say, this can be improved. It is quite a lot less code than Canon's method required. Plus this deals with all values and objects or collections as the source. On Tue, May 1, 2018 at 7:39 AM Julio Carneiro via 4D_Tech < 4d_tech@lists.4d.com> wrote: > Here is an example I’m using: > > C_COLLECTION($aOrderByCols) > $aOrderByCols:=Split string($orderBy;"%";sk ignore empty > strings+sk trim spaces) > > $orderBy is a text string with “%” separated terms, like “foo %bar%more > %%data”. > > As a result of the statement above, $aOrderByCols will become: > [“foo”,”bar”,”more”,”data”], as spaces and empty items are trimmed. > > That replaces a utility method í’ve had for decades. > > julio > > > On May 1, 2018, at 1:14 AM, Kirk Brooks via 4D_Tech < > 4d_tech@lists.4d.com> wrote: > > > > Miyako, > > This occurred to me too. Sadly there's no example for that in the docs. > > Would you happen to have a bit of code showing how it's intended to be > used? > > > > On Mon, Apr 30, 2018 at 2:22 PM Keisuke Miyako via 4D_Tech < > > 4d_tech@lists.4d.com> wrote: > > > >> the command "Split string", although generic, > >> was specifically created to help parse dot notation. > >> > >> http://doc.4d.com/4Dv16R6/4D/16-R6/Split-string.301-3644822.en.html > >> > > > > -- > > Kirk Brooks > > San Francisco, CA > > ======================= > > > > *We go vote - they go home* > > ********************************************************************** > > 4D Internet Users Group (4D iNUG) > > FAQ: http://lists.4d.com/faqnug.html > > Archive: http://lists.4d.com/archives.html > > Options: https://lists.4d.com/mailman/options/4d_tech > > Unsub: mailto:4d_tech-unsubscr...@lists.4d.com > > ********************************************************************** > > -- > Julio Carneiro > > > > > > -- > Julio Carneiro > jjfo...@gmail.com > > > > ********************************************************************** > 4D Internet Users Group (4D iNUG) > FAQ: http://lists.4d.com/faqnug.html > Archive: http://lists.4d.com/archives.html > Options: https://lists.4d.com/mailman/options/4d_tech > Unsub: mailto:4d_tech-unsubscr...@lists.4d.com > ********************************************************************** -- Kirk Brooks San Francisco, CA ======================= *We go vote - they go home* ********************************************************************** 4D Internet Users Group (4D iNUG) FAQ: http://lists.4d.com/faqnug.html Archive: http://lists.4d.com/archives.html Options: https://lists.4d.com/mailman/options/4d_tech Unsub: mailto:4d_tech-unsubscr...@lists.4d.com **********************************************************************