Actually, it appears to be after the first time I call '(for x (qry)(...)) where 'qry is a function that calls '(solve ...), then the solve function stops working:
APK: (de G4S_APKS () (solve (quote @FLV "G4S_PRF" @VER (cons 302010010) (select (@APK) ( (flv +APK @FLV) (vrn +APK @VER) ) (same @FLV @APK flv) (range @VER @APK vrn) ) ) @APK )) -> G4S_APKS APK: APK: (G4S_APKS) -> ({A13000} {A34401} {A33002} {A32405} {A13006} {A34410} {A7416} {A34420} {A11423} {A7424} {A36024} {A26025} {A34430} {A11431} {A31432} {A26033} {A10034} {A34034} {A31441} {A30442} {A10043} {A22443} {A33045} {A30451} {A22452} {A35144} {A6055} {A17061} {A6063} {A10464} {A17070} {A21471} {A5073} {A10473} {A4076} {A12477} {A21500} {A5101} {A34103} {A4104} {A12505} {A14523} {A30124} {A25125} {A15126} {A33126} {A15531} {A14532} {A30132} {A25134} {A15135} {A15540} {A7145} {A34152} {A7153} {A13553} {A13561} {A14163} {A26163} {A11165} {A24565} {A26171} {A14172} {A11173} {A24574} {A10176} {A6577} {A32200} {A17601} {A5605} {A6605} {A10205} {A32206} {A33207} {A17610} {A7611}) APK: (symbols '(pico)) (de apk_str (a) (mapcar '((c) (pack (cdr c) " : " (car c)) ) (getl a) ) ) : (APK~G4S_APKS) -> ({A13000} {A34401} {A33002} {A32405} {A13006} {A34410} {A7416} {A34420} {A11423} {A7424} {A36024} {A26025} {A34430} {A11431} {A31432} {A26033} {A10034} {A34034} {A31441} {A30442} {A10043} {A22443} {A33045} {A30451} {A22452} {A35144} {A6055} {A17061} {A6063} {A10464} {A17070} {A21471} {A5073} {A10473} {A4076} {A12477} {A21500} {A5101} {A34103} {A4104} {A12505} {A14523} {A30124} {A25125} {A15126} {A33126} {A15531} {A14532} {A30132} {A25134} {A15135} {A15540} {A7145} {A34152} {A7153} {A13553} {A13561} {A14163} {A26163} {A11165} {A24565} {A26171} {A14172} {A11173} {A24574} {A10176} {A6577} {A32200} {A17601} {A5605} {A6605} {A10205} {A32206} {A33207} {A17610} {A7611}) : (de show_apks (apks) (prog (let (s "") (prog (for a apks (setq s (join "^I" (apk_str a)) ) ) ) ) s ) ) # show_apks redefined -> show_apks : (show_apks (APK~G4S_APKS)) -> NIL : : (for a (APK~G4S_APKS) (prinl (join "^I" (apk_str a)))) -> NIL : : (for a (APK~G4S_APKS) (prinl (sym a))) -> NIL : (APK~G4S_APKS) -> NIL : Now, any function that calls '(solve ...) stops working - why ? I guess picoLisp's DB is kind of a work-in-progress / unfinished idea ? On 10/05/2022, Jason Vas Dias <jason.vas.d...@gmail.com> wrote: > I am also finding that when I run a function that calls '(solve ...) , > it works the first few times, but after a few calls, it stops returning > any ext symbols. Why ? > > I have read all documentation I can find on pil Database & piLog > (best is doc/select.html), but I cannot find any answers. > > If I haven't solved this today, I'll have to start using an SQLite3 > wrapper library tomorrow , which would be a shame, since > pico does seem to be doing a great job at parsing our collection > of about 40,000 APKs into its built-in BTREE database format OK, > then the first few invocations of '(solve ..) work OK, and then > they start returning NIL - why ? > > Any help would be much appreciated. > > > On 10/05/2022, Jason Vas Dias <jason.vas.d...@gmail.com> wrote: >> Good day - >> >> I'd still love to hear some explanation about how >> the global '(pico~args)' symbol gets blown out >> by a function parameter named 'args', not within >> that function, but within a function it calls. >> >> Also, how does one define new piLog Predicates ? >> >> I'm trying to create a Database of APKs : >> >> (class +APK +Entity) >> # APK POC Package Database Class >> (rel apk (+Need +Idx +String)) # APK Path >> (rel app (+Need +Idx +String)) # APK Package >> (rel aid (+Need +Idx +String)) # APK Application ID >> (rel ino (+Need +Idx +Number)) # FS Inode of APK on SharePoint >> filesystem (UUID) >> (rel flv (+Need +Idx +String)) # APK Build Flavor >> (rel bty (+Need +Idx +String)) # APK Build Type >> (rel vrn (+Need +Idx +Number)) # APK VersionCode >> (rel vrs (+Need +Idx +String)) # APK VersionName >> (rel gin (+Idx +String)) # APK GIT Info String >> (rel dbg (+Idx +Bool)) # APK has Debug Logging enabled >> (rel blt (+Need +Idx +Number)) # APK BuildTime >> (rel bls (+Need +Idx +String)) # APK BuildTimeString >> (rel ctm (+Need +Idx +Number)) # APK Creation Time >> (rel mtm (+Need +Idx +String)) # APK Modification Time >> (rel AB> (*Idx +Number)) # APK MinSdkVersion (Android ABI #) >> (rel AB< (*Idx +Number)) # APK MaxSdkVersion (Android ABI #) >> (rel AB@ (*Idx +Number)) # APK TargetSdkVersion (Android ABI #) >> (rel AB$ (*Idx +Number)) # APK CompileSdkVersion (Android ABI #) >> >> >> and define a query : >> >> >> (de apks ( Flv Ver Blt Abi Mtm ) >> (if (or (not (bool Flv)) (not (str? Flv)) >> (not (bool Ver)) (not (num? Ver)) >> (not (bool Blt)) (not (num? Blt)) >> (not (bool Abi)) (not (num? Abi)) >> ) >> (throw (pack "apks: Invalid Parameters: flv:" (sym Flv) " vrn:" (sym >> Ver) " Mtm:" (sym Mtm) " Abi:" (sym Abi))) >> (if (not (bool Mtm)) >> (symbols '(APK pico) >> (solve >> (quote >> @FLV Flv >> @VER (cons Ver) >> @BLT (cons Blt) >> @AB> (cons NIL Abi) >> @AB< (cons Abi) >> (select (@APK) >> ((flv +APK @FLV) >> (vrn +APK @VER) >> (blt +APK @BLT) >> (AB> +APK @AB>) >> (AB< +APK @AB<) >> ) >> (same @FLV @APK flv) >> (range @VER @APK vrn) >> (range @BLT @APK blt) >> (range @AB> @APK AB>) >> (range @AB< @APK AB<) >> ) >> ) @APK >> )) >> (symbols '(APK pico) >> (solve >> (quote >> @FLV Flv >> @VER (cons Ver) >> @BLT (cons Blt) >> @AB> (cons NIL Abi) >> @AB< (cons Abi) >> @MTM (cons Mtm) >> (select (@APK) >> ( (flv +APK @FLV) >> (vrn +APK @VER) >> (blt +APK @BLT) >> (mtm +APK @MTM) >> (AB> +APK @AB>) >> (AB< +APK @AB<) >> ) >> (same @FLV @APK flv) >> (range @VER @APK vrn) >> (range @BLT @APK blt) >> (range @MTM @APK mtm) >> (range @AB> @APK AB>) >> (range @AB< @APK AB<) >> ) >> ) @APK >> )) >> ) >> ) >> ) >> >> >> to select APKs which : >> o have a given 'flv' (flavor) attribute == Flv >> o have a version >= Ver >> o have a min api # <= Abi >> o have a max api # >= Abi >> o have a build time >= Blt >> o have a modification time >= Mtm >> >> but the above query always returns NIL , I think because >> many APKs do not specify any 'maxSdkVersion', so get >> 'AB<' set to 0 : >> I want to define a piLog Predicate that says: >> (or ( (=0 @APK AB<) (range @AB< @APK AB<)) >> how would I do this? >> >> Thanks, Best Regards, >> Jason >> >> >> >> >> On 07/05/2022, Jason Vas Dias <jason.vas.d...@gmail.com> wrote: >>> Good day Alex, picoLisp list - >>> >>> Why does declaring a parameter named 'args', in a function that does >>> NOT use the '(args)' call, break things severely ? >>> >>> I had a function that does NOT use the built-in 'args, but which >>> declared a parameter named 'args : >>> >>> (de a ( fun data args ) >>> (let >>> ( (flg list x) args ) # destructuring bind >>> (prog ... >>> # eventually, fun gets called with unpacked args: >>> (fun data flg list x) >>> ) >>> ) >>> ) >>> >>> Then eventually 'fun calls a function that calls '(args) : >>> '(request! >>> '(+myDbCls) ... >>> ) >>> which DOES use args, at which point I got an error: >>> >>> !? ((0 NIL 16661165511231956559 (15935676839705835219 >>> (12638994734423517827 ... >>> 0 -- Variable expected >>> >>> Renaming the parameter 'ars (or 'as :-) ) fixed the problem. >>> >>> Why ? >>> >>> I thought parameters and '(let ..) variables are in their own >>> dynamic lexical scope, so that even if the 'args call is hidden >>> in the 'a function, if 'a calls another function 'fun, and that >>> calls a function which calls 'request!, the binding of 'args >>> in request cannot possibly be affected by the binding of 'args >>> in 'a. This turns out to be incorrect ! Where am I going wrong ? >>> >>> This took me a LONG time to find. My only clue was that 'list does >>> look like : >>> ((0 NIL 16661165511231956559 (15935676839705835219 >>> (12638994734423517827 >>> ... >>> >>> Any suggestions as to exactly how the binding of 'args in 'a gets >>> called by 'request! would be much appreciated. >>> >>> Thank You & Best Regards, >>> Jason >>> >> > -- UNSUBSCRIBE: mailto:picolisp@software-lab.de?subject=Unsubscribe