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

Reply via email to