秀丸の「関数」や「文」をラップしてみよう

秀丸マクロの「関数」や「文」をPHPの関数として使えるようにラップしてみましょう。
秀丸マクロでは「関数」とは「引数にカッコが付いており、値が返るもの」、 「文」とは「引数にはカッコが付かず、値が返らないもの」です。

PHP上では、区別は特になく、「値が返る関数」と「値が返らない関数」程度の違いととらえればよいでしょう。

wcsmidstr( s1, n1, n2 ) 関数

https://help.maruo.co.jp/hidemac/html/070_Function_wcsmidstr.html
の関数をラップしてみましょう。

実際には、PHPの方がはるかに豊富な文字列系機能を備えているため、このような関数をPHPでラップする 必要はありませんが、
今回は練習だと思ってください。

mytest.php
<?php
function my_midstr(string $s1, int $n1, int $n2): string {
    global $Hm;

    // 「PHPの引数」を「秀丸マクロの変数」へと渡す
    $Hm->Macro->setVar('$_TMP_S1', $s1); // 文字列変数へ
    $Hm->Macro->setVar('#_TMP_N1', $n1); // 数値変数へ
    $Hm->Macro->setVar('#_TMP_N2', $n2); // 数値変数へ

	// 秀丸マクロとして該当の引数を利用して
    list($result, $error) = $Hm->Macro->doEval(<<<'MACRO'
        $_TMP_MIDSTR_RESULT = wcsmidstr($_TMP_S1, #_TMP_N1, #_TMP_N2);
    MACRO
    );

	// 実行に成功した時は、秀丸マクロの結果変数を返す
    if ($result >= 1) {
        return $Hm->Macro->getVar('$_TMP_MIDSTR_RESULT');

	// 失敗した時は悩ましいが今回は簡略化して空文字を返す。例外を返してもいいかもしれない。
    } else {
        return "";
    }
}

// 対象の文字列の1番目から2文字分
$aaa = my_midstr("あいうえお", 1, 2);
echo $aaa;
?>

引数をsetVarで渡し、関数や文を実行し、返り値をgetVarでもらう

上の例のように、引数をsetVarで渡し、関数や文を実行し、返り値をgetVarでもらう。
これがラッピング方法の大原則です。

文字列の引数の中身を、直接 doEvalのヒアドキュメント内で文字列として連結するのは避けましょう。
「"」が文字列中に含まれていたらどうなるなどの悩ましい問題が出てくるためです。

そのような問題が発生しない、「getVar, setVarによる変数の伝搬」を構築の基本としましょう。

以上を理解していれば、ラッピングの実装を誤ることはないでしょう。

さらに簡単に実装できる

hmPeachにはさらに簡単に実装できる仕組みが用意されています。

mytest.php
<?php
function my_midstr(string $s1, int $n1, int $n2): string {
    list($result, $args, $error, $message) = $Hm->Macro->doFunction->wcsmidstr($s1, $n1, $n2);
	return $result;
}
 
// 対象の文字列の1番目から2文字分
$aaa = my_midstr("あいうえお", 1, 2);
echo $aaa;
?>