6

内部に別の関数を含む関数を定義しています:

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 
}

関数をコンパイルすると、機能します。行を1つずつ実行すると機能します。ただし、関数を呼び出そうとすると、エラーが発生します。

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

ネストされた関数で Ndays を削除し、明示的に 10 を記述すると、機能します。関数の実行時に、ネストされた関数内のローカル変数の可視性の問題だと思います。つまり、ネストされた関数は、関数 find_badTicks のローカル変数である Ndays を認識できません。内部関数内で Ndays を表示する方法を知っていますか? ありがとうマルコ

4

2 に答える 2

4

関数内から、その関数内で定義された変数を参照したり、グローバルに定義された変数 (メインの名前空間など) を参照したりできます。

中間関数で定義された変数は、別の関数内では表示されず、値エラーが発生します-ご覧のとおり。

于 2013-05-30T17:21:39.450 に答える
4

@ user2242865 は正しいです。q のレキシカル スコープは多少制限されています。グローバル (適切な名前空間を持つ) と、関数自体の中で定義された変数のみを参照できますが、直接のコンテキストの外部で定義されたものは参照できません。

于 2013-06-04T14:40:34.507 に答える