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