トップ 最新 追記

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|

2008-11-01 [長年日記]

_ [雑記]後は飛行機が飛べば...

日本に帰れます。

荷物の重量が予想よりかなり重く表示されたので焦りましたが、 オーバーウェイトチャージの要求もなくチェックインは無事終了。 今日は、すごくルーズだった気がする。

本日のツッコミ(全4件) [ツッコミを入れる]

Before...

_ Y氏 [先ほど無事帰って参りました (^^]

_ タチコマ(バトー専用) [お帰りなさい。光学機動隊に復帰だね。 課長は外遊中みたいだけど。]

_ バトー [課長は間もなくご帰国だ。留守中にこちとらがノルマ達成出来なかったもんで、御機嫌斜めだとよ。]


2008-11-06 [長年日記]

_ [KEKB]久しぶりにKEKBの立ち上げに参加

パネルのバグ取りというか、データベースの命名ルール違反への 対応作業をする

本日のツッコミ(全1件) [ツッコミを入れる]

_ 少佐 [「帰国早々で申し訳ないが、課長の新戦略に基づき、シミュレーションで戦術の最適解を探れ。頼んだぞ」]


2008-11-09 [長年日記]

_ [雑記]SICP入手

秋葉原にて、Structure and Interpretation of Computer Programsを入手

これで、ON LISPと合わせて、LISP系な関数言語の実装と実践が系統的に学べる...

本日のツッコミ(全2件) [ツッコミを入れる]

_ Y氏 [こう書いているということは原書の方ですよね (^^]

_ イシカワ [イシカワ「Lima区画防壁に綻び。座標は Sierra Charlie 21 Kilo 6 」 少佐「ボーマ、至急ワ..]


2008-11-11 [長年日記]

_ [FreeBSD]Emacs 22.3へ移行

ports/editors/emacsが 22.3になったので、emacsを入れ替えて 3rd partyのelisp packageを再コンパイル


2008-11-14 [長年日記]

_ [SAD]MacOSX 10.5 for Intelが変?

SFMTのinit_by_array()がなぜか呼び出されない...

MacOSX 10.4 for Intelだと問題ない&シンボル名を変更すると動くので、 シンボルの衝突が原因か?

一体、実行時に何が起こっている...


2008-11-19 [長年日記]

_ [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[]ブロックでシンボルに拘束すると、 その瞬間に再帰的展開を開始してしまうので要注意。

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


2008-11-20 [長年日記]

_ [SAD][Lisp]複数の引数を伴う再帰関数を定義するY-Combinator

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

生成した再帰関数を包むpure functionで、##を 受けとるようにしただけ

アキュムレータを使った再帰関数の例

リストの平均値を求める

avgY = Y[With[{action = #}, Which[
  Length[{##}] < 3, action[#1, 0, 0],
  Length[#1] > 0,   action[Rest[#1], #2 + 1, #3 + First[#1]],
  True,             #3 / #2]&]&];

リストの標準偏差を求める

sigmaY = Y[With[{action = #}, Which[
  Length[{##}] < 4, action[#1, 0, 0,
    Y[With[{action = #}, Which[
      Length[{##}] < 3, action[#1, 0, 0],
      Length[#1] > 0,   action[Rest[#1], #2 + 1, #3 + First[#1]],
      True,         #3 / #2]&]&][#1]],
  Length[#1] > 0,   action[Rest[#1], #2 + 1, #3 + (First[#1] - #4)^2, #4],
  True,                   Sqrt[#3 / (#2 - 1)]]&]&];

最初に平均値を求める部分に avgY相当の無名関数を使っている

_ [SAD][Lisp]factYの末尾再帰への変形

単純な再帰を Y-Combinatorで書いた基本形

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

アキュムレータを導入して、末尾再帰化

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

最初の呼び出し(アキュムレータの初期化)を再帰の外に出した移す

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

2008-11-26 [長年日記]

_ [FreeBSD]7.1-RELEASEは大丈夫なのかな?

GEOMで mirrorしたディスクを journalしてnewfs -Jしたら カーネルパニックした。

これって、結構致命的な気がするのだが...

本日のツッコミ(全3件) [ツッコミを入れる]

_ Y氏 [何か素敵な感じですねぇ(笑)gmirrorは二年くらい使ってノートラブルなんで、g journalが悪かったりして。..]

_ 光学機動隊 [少佐『明日未明に鉄人とも番長とも呼ばれるY氏が甲殻機動を極める」 課長「]

_ 光学機動隊 [課長「我々の間には、チームプレーなどという都合のよい言い訳は存在せん。有るとすればスタンドプレーから生じる、チームワ..]


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