Jumpei Arakawa
araka****@infoc*****
2005年 11月 10日 (木) 20:47:20 JST
荒川です。 # 遅れてスマン。なんか返信したつもりになってた(^^; 下記の問題ですが、結合則における内部名に規則を変えることで対応すればよいと思います。 わかりやすくするために、結合する引数を[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