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 <[email protected]> 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 <[email protected]> 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 <[email protected]> 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:[email protected]?subject=Unsubscribe