ToDo:
これって、組み込み関数シンボルを特殊扱いしているせいでは無いだろうか...
組み込み関数を直接書かなければ、
In[1]:= f = Sin Out[1]:= Sin In[2]:= Hold[f[1]] Out[2]:= Hold[f[1]] In[3]:= ReleaseHold[Out[2]] Out[3]:= .841470984807896
になるようです
おそらく、itfunalocで定義した組み込み関数は SADScript側から 再定義出来ないので、Hold[]前とReleaseHold[]後の評価結果が 一致することを暗に仮定して正格評価を行っていると思われる。
さらに、Hold[]にツッコミを入れると、Hold[]が実際に保存するのは 評価前の構文木なわけで、組み込み関数はシンボルその物ではなく 関数番号が構文木に組み込まれるので、Hold[]した結果を ReleaseHold[]する前に itfunalocで定義済みの関数シンボルを オーバーライドするとReleaseHold[]時に評価される関数は、 オーバーライド後ではなくオーバーライド前の関数になるという 一見不可思議な現象が発生します。 さらに、Hold[]を ToStringでシリアル化してToExpressionで式に 変換した場合はオーバーライド後の関数に化けるはず。
カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記
SADTkinterのマニュアルのp.98には<br> Hold[Sin[1]] ⇒ Hold[Sin[1]]<br>と書いてあるのだが、マニュアルを訂正すべきなのだろうか。