Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Variable visibility when defining functions inside functions with q

Tags:

kdb

I am defining a function that contains another function inside:

find_badTicks:{ [tab;sec] // dummy function, for debug..
  Ndays: 10i ;
  dates: select distinct date from tab where sym = sec ;
  closures: select last price by date from tab where sym = sec ;
  returns: 1 _ select ( (price)-(prev price) )%(prev price)  from closures  ;
  stdevs: {[x;y] sd[ (Ndays-1)#y _ x ] } [ (returns)[;`price] ] each til ( (1 - (Ndays-1)) + count (returns)[;`price] ) ;
  :tab 
}

If I compile the function it works. If I run the lines one by one it works. However, if I try to call the function I get an error:

  q)testTab: find_badTicks [testTab ; `ENI.IM.Equity] ;
  'Ndays

If I remove Ndays in the nested function, writing explicitly 10, it works. Si I guess it's a problem of local variable visibility inside nested functions, in function execution: i.e. the nested function cannot see Ndays, which is a local variable of the function find_badTicks. Do you know how I can make Ndays visible inside inner functions? Thanks Marco

like image 596
Marco Mene Avatar asked May 30 '13 08:05

Marco Mene


2 Answers

@user2242865 is right. Lexical scoping in q is somewhat limited. You can only reference globals (with the appropriate namespace) and variables defined within the function itself, but not anything defined outside of its immediate context.

like image 55
JPC Avatar answered Sep 29 '22 20:09

JPC


From within a function you can refer to variables defined within that function, and also to globally defined variables (either in the main namespace or others).

Variables defined in intermediate functions are not visible within another function, and will cause a value error - as you saw.

like image 20
user2242865 Avatar answered Sep 29 '22 20:09

user2242865