初心者のFileMaker pro Q&A (旧掲示板)

みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。

1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)

You are not logged in.

Announcement

新しい掲示板は、こちら:https://fm-aid.com/forum/t/filemaker


#1 2021-03-24 17:07:41

かなえる
Guest

カスタム関数の再帰について

お世話になります。

Win10
FileMaker pro16で使用しています。

現在カスタム関数を勉強しており、
「あいう」というテキストがあった場合に、

あいう
あい

いう

という風にする関数を作成したい思っております。

以下の様なカスタム関数を作成し、
1文字目を階段にすることは出来たのですが、
2文字目以降を階段にする方法に苦慮しております。

Let (
[
 length =
  Length ( テキスト );

 cnt  = 
  1

] ;

Case ( 
 length > 0 ; 
 テキスト &  "¶" & _Stairs_wordMax ( Middle ( テキスト ; cnt  ; length-1   ));
)

)

スクリプトであれば、loopを使用して達成できたのですが、
カスタム関数を使用する場合どのようにすればよいかご教授いただければ幸いです。
スクリプトのように、loopでcntに1を足せれば出来そうな気がするのですが・・・

恐れ入りますが、よろしくお願い致します。

#2 2021-03-24 22:05:55

himadanee
Guest

Re: カスタム関数の再帰について

もう1つ関数を作って、呼び出せはいいのでは。

現バージョンではWhile関数が実装されてるので、いまさらという感じですが。

#3 2021-03-24 23:08:15

Hiro
Member

Re: カスタム関数の再帰について

入れ子の2重ループ計算が必要だから、2重カスタム関数定義より「Wループ計算」一括式の方が今回は簡略でしょう!
(※式は分かり易いように少し冗長に記述)
Let(
[
   $txt=テキスト;
   $n=Length($txt);
   $i=0;
   $res=Char(0);

//▼親ループ定義
$LOOP=
   "Case($i=$n
      ; $res
      ; Let([
               $i=$i+1;
            $itm=Middle($txt; $i; $n);
               $j=0;
               $m=Length($itm);
               $r=Char(0);
               #res=Evaluate($SUB);
            $res=List($res; #res)
            ]; Evaluate($LOOP))
   )";

//▼子ループ定義
$SUB=
   "Case($j=$m
      ; $r
      ; Let([
               #itm=Left($itm; $m-$j);
            $r=List($r; #itm);
               $j=$j+1
            ]; Evaluate($SUB))
   )"

];

   Evaluate($LOOP)

)

Offline

#4 2021-03-25 10:56:40

かなえる
Guest

Re: カスタム関数の再帰について

himadaneeさん
ありがとうございます。
1つにこだわらずに、2つ目で完成させるということですね。
こちらも挑戦してみようと思います。

Hiroさん
ありがとうございます。
Evaluate関数を使うのですね。
式を理解し、実装したいと思います。

Evaluateを計算式に使用すると、索引が貼れなくなると思っていたのですが、
問題なく貼れるのですね。(私の作り方が悪かったのでしょう・・・。)
リレーションに使用したかったので大変助かりました。

#5 2021-03-25 17:59:16

Shin
Member

Re: カスタム関数の再帰について

2重ループが不要な再帰式です。並び方が重要でしたら、内部の式の加工で対応できます。{ 1,1 ; 2,2 ; 2,1 ; 3,3 ; 3,2 ; 3,1 } という2重数列を作り、それを加工して文字列を切り出しています。

Let(
[
	$txt	= text ;
	$len	= Length ( $txt ) ;
	$row	= ( $len ^ 2 + $len ) / 2 ;
	$i 	= 0 ;
	$res	= "" ;


	$eva =
		"Case (
			$i = $row ; $res ;
			Let(
			[
				$i = $i + 1 ;
				$l = Int ( Sqrt ( 2 * $i - 1.75 ) + .5 ) ;
				$p = ( $l ^ 2 + $l ) / 2 - $i + 1 ;
				$res = List ( $res ; Middle ( $txt ; $p ; $len + 1 - $l ) ) 
			] ; 
				Evaluate ( $eva )
			)
		)"
] ;
	Evaluate ( $eva )
)

Last edited by Shin (2021-03-26 17:48:28)

Offline

#6 2021-03-26 11:38:03

かなえる
Guest

Re: カスタム関数の再帰について

Shinさん
数年前にも別の質問でご回答頂いたことを記憶しております。
今回もありがとうございます。

2重ループしなくても達成できるのですね。
こちらも計算式を解析してみたいと思います。

#7 2021-03-26 11:47:50

チポ
Member

Re: カスタム関数の再帰について

リレーションで部分一致の照合をしたいのでしょうかネ

部分一致 リレーション
でここを探すと他の方法も有りますよ。

Offline

#8 2021-03-26 14:19:38

かなえる
Guest

Re: カスタム関数の再帰について

チポさん
ありがとうございます。

>リレーションで部分一致の照合をしたいのでしょうかネ
>部分一致 リレーション
>でここを探すと他の方法も有りますよ。

達成したいことはその通りでございます。
ずっと「テキスト バラバラ、分解」などで
検索しておりました。苦笑

他の方法もチェックしてみたいと思います。

Registered users online in this topic: 0, guests: 1
[Bot] ClaudeBot

Board footer

Powered by FluxBB
Modified by Visman

[ Generated in 0.006 seconds, 9 queries executed - Memory usage: 561.89 KiB (Peak: 581.77 KiB) ]