「なでしこv1」開発掲示板

なでしこv1のバグや要望を書き込む掲示板
[一覧へ] > (@646) [低] [未処理]
@646■ (#2041) 「戻る」が戻りすぎる - うぇいく (2012-08-29 21:45) /低 未処理
【症状】グループ内関数(Method)をの呼び出しに「→」を使用して、その関数が「戻る」で終わらせた場合、関数呼び出しを1段多く戻る。
【再現方法】
以下を実行すると、「う」が表示されません。あ→いの中の戻るにて関数うからも抜けてしまいます。
■あ
 ・い~
  「い」と表示
  戻る

えとはあ

●う
 え→い
 「う」と表示



【要望】普通に。
【バージョン】1.53352
【その他】
上記再現ソースのうち、「 え→い」を、「 え→い()」にすると回避可能。→ではなく「えのい」と普通に呼び出すても正常。構文から関数と判断できないケースでうまく行かない模様。
himaparser.pasの4988あたりを、以下のようにすると治るものの、他への影響が心配(現在は、MethodのメンバーのNodeそのものが返る。この変更を行うと、Methodを引数なしで指定して「メソッドの参照」のようなことができなくなる。)
      svLinkGroup:
        begin
          group := Result;
          //if group = nil then Break;//敢えてエラーを出した方がシンプル
          FGroupScope := hi_group(group);
          Result := hi_group(group).FindMember(pe.groupMember);
          //--- 関数の場合がある
          if Result.VType = varFunc then
          begin
            Result := HiSystem.RunGroupMethod(group, Result, pe.Stack);
          end else
          begin
            if pe.Stack <> nil then raise HException.Create('『'+hi_id2tango(pe.groupMember)+'』は関数ではないのに引数があります。');
          end;
          //---
          pe := pe.NextElement;
        end;

(#2042) 追加補足(Setter/Geteer) - うぇいく (2012-09-01 16:17) /低 未処理
 もうちょっと調べてみたら、この処理の流れはグループのプロパティのGetterMethodの場合も同じになるようです。この場合、呼び出し側で「→」ではなく「の」を用いていても同じ状態になります(GetterMethodが「戻る」で終わると戻りすぎることになる)
(なお、先の修正を行っても、GetterMethodはそのままです)
処理のルートはちがいますが、SetterMethodも同じ条件のようでした。
 先の修正を適用の上で、Getter/Setterについての「戻る」が使えない点(エラーにはならないけど、正しく動かない)については、注意点・制限とする でも良い気がします。
(ユーザ向けというよりも、システム側向けの機能のため。Setter/Getterを使おうというユーザはプログラミング慣れしていることを期待できるのではという。)

(#2041)へ返信する:

👆お手数ですが、いたずら防止のために、「真夏」の読み方を記入してください。

編集時に使うキーを入力(省略可能)

画像ファイル(最大300KB)を添付可能