トップ «前の日(11-18) 最新 次の日(11-20)» 追記

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|

2008-11-18

_ [SAD][Lisp]Y-Combinator

再帰の勉強成果

Y = With[{core = #},
  With[{procedure = #},
    core[procedure[procedure][#]&]]&[
      With[{procedure = #},
        core[procedure[procedure][#]&]]&]]&;

試してみる

fact[n_] := Which[
  n < 1,  1,
  True,   n * fact[n - 1]];

factY = Y[With[{action = #}, Which[
  # < 1,  1,
  True,   # * action[# - 1]]&]&];

Table[Print["i = ", i,
  " fact[i] = ", fact[i], " factY[i] = ", factY[i]], {i, 10}];

実行結果

i = 1 fact[i] = 1 factY[i] = 1
i = 2 fact[i] = 2 factY[i] = 2
i = 3 fact[i] = 6 factY[i] = 6
i = 4 fact[i] = 24 factY[i] = 24
i = 5 fact[i] = 120 factY[i] = 120
i = 6 fact[i] = 720 factY[i] = 720
i = 7 fact[i] = 5040 factY[i] = 5040
i = 8 fact[i] = 40320 factY[i] = 40320
i = 9 fact[i] = 362880 factY[i] = 362880
i = 10 fact[i] = 3628800 factY[i] = 3628800

正しく、再帰している。

Yを定義するときの注意

再帰コアprocedure[procedure][#]&[#]&が重要。 procedureは、関数を引数にして再帰定義な関数を返す。 従って、procedure[procedure]の戻り値は関数なので、 一見[#]&が冗長に見えるが、SADは引数を正格評価するので pure functionにしておかないと、Yを作用させた瞬間に procedureを再帰的に展開してしまいスタックを食いつぶす。 また、下手にWith[]ブロックでシンボルに拘束すると、 その瞬間に再帰的展開を開始してしまうので要注意。

多分、すべての引数を遅延評価で評価する処理系の場合、 無くても動くような気がする。


2017-11-18

_ [SAD]itfunalocの再実装

backendの関数テーブルを含めて、モジュールベースでの再実装を行い、dlfunalocとの統合を実施した

dlfunaloc経由で登録した関数については、itfunalocが構成した関数ポインタテーブルから直接ディスパッチ出来る

残っている作業

  • tfefun1にあるmap属性の処理コードをeval_funcに統合し、map属性付き関数のディスパッチを実装する
  • 一部の予約オペレータでnargが負のものがあるが、map/eval array参照がrangeoverしないことを確認する
    • tfseval@src/tfeeval.fでは、narg < 0の際に iaat > 0にならない事がlogic levelで保証されている
    • tfefunrefへのパスで、narg < 0のオペレータ呼び出しが有るかを確認する必要がある
      • 初めからtfefun1側に保護logicを追加すべきか?
  • tfefun1/2/3epの再実装
    • itfunaloc/tefun*ベースの実装をdlfunaloc経由の関数ポインタディスパッチベースの実装に再編する
    • 独立した関数になっていない部分は、tail recursion形式のwrapper関数を実装する
      • function IDとディスパッチテーブルの管理から開放される

2018-11-18

_ [SAD]OpenSharedの64bit化について

現行コードではOpenSharedに成功時に、先頭アドレスが表現域内かつ終了アドレスが表現域外なケースが存在し、dump/restoreコード内のrlist配列のアドレス計算時に32bit符号付き添字演算がオーバーフローしてSEGVに至るケースが存在する(Linux/x86_64)

正しく、64bit対応にする際にやるべきこと

  • Sharedリソースを管理するLUNバッファにC_PTR型もしくはpointer型を格納可能にする(語長非依存のアドレス表現の導入)
  • mapallocによる割り当てをmmap_utils経由に切り替える
    • unmapを考えると pointer型に長さを保持させる方が良い?
  • Sharedによるdump/restoreコードの共有バッファ参照をrlistから独立した格納バッファ参照に切り替える
    • union的な動作を前提とするなら、FortranよりもCで書く方が良いか?

2021-11-18

_ [SAD]短期的な修正作業予定

  • =seq_expandedの local変数化= (2022/02/14実装)
    • seq_catx APIをpublic版とinternal版に分離して、local変数化した seq_expandedを pointer渡しで渡していく
  • Fortranコード側のNarg処理(空引数の関数呼び出し評価時に暗黙のNull引数を積み込むのを止めた後始末)
    • narg == 1時のNull引数の取扱い修正
    • 暗黙のnarg == 1仮定コードの修正

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記