[mie-dev:00015] Re: 再帰

Back to archive index

池田優一 eclip****@cspc*****
2005年 11月 11日 (金) 01:01:10 JST


池田です。

なるほど。
つか言語仕様見てみたら内部名はメタ結合の右側が引き継がれる
って書いてありました(汗
うまくできてるなぁw

継承のとき、

parent = [P| x = 0, y = {P.x}];
child = parent <+ [z = 0];
child.y!;

ってやったときには、child自体の内部名は空になるけど
childのフレンドであるparentの内部名はPのままだから
問題ないんだよね。


Jumpei Arakawa wrote:
> 荒川です。
> 
> # 遅れてスマン。なんか返信したつもりになってた(^^;
> 
> 下記の問題ですが、結合則における内部名に規則を変えることで対応すればよいと思います。
> 
> わかりやすくするために、結合する引数を[5]ではなく[ ARG | 5 ] にします。
> 
> fact = {FACT|n| if :(n <= 1) :{1} :{FACT[n-1]} !};
> fact5 = fact <+ [ ARG | 5 ]
> fact5!
> 
> この例は現在の仕様でも正しく動作します。なぜなら、
> fact5は { ARG | n = 5 | if :(n <= 1) :{1} :{FACT[n-1]} !} であり、
> FACTは外部名factで参照されるのと同じオブジェクトを指すからです。
> (継承元のプロトタイプを指す内部名としてとらえられる)
> 
> よって、fact [5] において問題に対処する方法としては、
> [5]は内部名がないので、新たに作られるオブジェクトも
> 内部名をなしにすればよいと思われます。
> 
> ----- Original Message ----- 
> From: "池田優一" <eclip****@cspc*****>
> To: "プログラミング言語mie開発用ML" <mie-d****@lists*****>
> Sent: Monday, November 07, 2005 11:58 PM
> Subject: [mie-dev:00011] 再帰
> 
> 
> | 池田です。
> | 
> | 作ってて気付いたんですが、
> | なんか再帰がうまくいきません。
> | 
> | fact = {FACT|n| if :(n <= 1) :{1} :{FACT[n-1]}!};
> | fact[5];
> | 
> | としたとします。
> | するとnに5が適用されて、
> | 
> | {FACT|n = 5| if :(n <= 1) :{1} :{FACT[n-1}!}!;
> | {FACT|n = 5| if :(5 <= 1) :{1} :{FACT[4]}!}!;
> | 
> | ここで {FACT[4]}の部分ですが、
> | 既にnは埋められているので、
> | 
> | {FACT|n=5, 4| if ...}
> | 
> | となってしまい、無限に4が追加されてしまいます。
> | どうしよ・・・
> | なんかいいアイデアないでしょうか。
> | _______________________________________________
> | mie-dev mailing list
> | mie-d****@lists*****
> | http://lists.sourceforge.jp/mailman/listinfo/mie-dev
> _______________________________________________
> mie-dev mailing list
> mie-d****@lists*****
> http://lists.sourceforge.jp/mailman/listinfo/mie-dev
> 
> 




mie-dev メーリングリストの案内
Back to archive index