hmPython 他の秀丸用言語シリーズと混ぜる

  • hmPython3とhmPyの連携

    当サイトのhm**の言語シリーズは、1つのマクロで1つしか使えないわけではなく、混ぜて利用が可能となっています。

    例えば、「ネイティブのPython」と「IronPython」との「(アウトプロセスではなく)インプロセス」での連携は、
    本来ですと、非常に面倒臭いことになるはずなのですが、
    hm**言語シリーズでは、恐ろしいほど簡単であるのみならず、
    その記述方法も言語を跨って、統一されています。

  • hmPython3とhmV8との連携をやってみる

    以下では、

    • ネイティブの組み込みPythonエンジンとなる「hmPython3」
    • ネイティブなECMAScriptエンジンにマネージドを扱える仕組みを加えた「hmV8」

    とを、インプロセスで処理をまぜこぜにしています。

    秀丸マクロの変数環境空間を、
    いわば「言語同士をインプロセスで繋げるバッファー」のように見立てて
    変数の値を、手軽に伝達しあえるのがわかるかと思います。

      //------------------------------------------------------
      // Python部分
      //------------------------------------------------------
      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      aaa = 1000
      bbb = "あいうえお"
      
      hm.Macro.Var['#aaa'] = aaa # 秀丸マクロに数値として伝達
      hm.Macro.Var['$bbb'] = bbb # 秀丸マクロに文字列として伝達
      
      
      )PY"
      );
      
      //------------------------------------------------------
      // ここではfreedllせずに継続しておいて、最後にfreedllしている
      // freedll( #PY );
      
      
      //------------------------------------------------------
      // ECMAScript6のV8エンジン(.NET有り)の部分
      //------------------------------------------------------
      #ES = loaddll( hidemarudir + @"\hmV8.dll" );
      
      #_ = dllfuncw( #ES, "DoString", R"ES(
      
      let aaa = hm.Macro.Var['#aaa'] // 秀丸マクロから受信
      let bbb = hm.Macro.Var['$bbb'] // 秀丸マクロから受信
      
      let lib = host.lib("System.Windows.Forms");
      let Forms = lib.System.Windows.Forms
      
      Forms.MessageBox.Show( aaa.toString(), bbb, Forms.MessageBoxButtons.YesNoCancel, Forms.MessageBoxIcon.Information );
      
      
      hm.Macro.Var['#aaa'] = aaa + 111;
      
      )ES"
      );
      
      freedll( #ES );
      
      
      //------------------------------------------------------
      // また、Pythonへと戻ってくる
      // loaddllせずに、そのまま利用するので、前のPythonの続き扱いとなる
      // ちゃんとhmV8が行った値の変更も反映されている。
      //------------------------------------------------------
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      ccc = hm.Macro.Var['#aaa']  # 秀丸マクロから受信
      
      hm.debuginfo( aaa )
      hm.debuginfo( ccc )
      
      )PY"
      );
      
      //------------------------------------------------------
      // ここで freedll
      freedll( #PY );
      
      
  • hmPython3とhmPyとの連携をやってみる

    hmPythonは、いわゆる「最も普通のPython」ですので、
    非常に多くの外部ライブラリを使うことが出来ます。

    但し、この通常のPythonはあまりGUIが得意ではありません。
    少なくとも.NETのC#などと比較すると目も当てられないレベルです。

    一方このようなものをフォローするものとして、IronPythonが存在します。
    IronPythonは、.NET Frameworkのほとんど全ての機能が利用可能なPythonですが、
    通常のPythonとは異なるため、外部ライブラリが対応しているものが非常に少ない、という弱点があります。

    そこで、処理のコアは「hmPython3」で記述し、GUI付近だけ「hmPy」で記述する、
    という考え方は、有力なものとなります。

    ちょうどC++とC#のような関係と言えるでしょう。
    先述の「hmV8」の部分を「hmPy」に置き換えてみましょう。

    Python同士であるため、記述方法も一層一貫性がもてます。

      
      
      
      //------------------------------------------------------
      // Python部分
      //------------------------------------------------------
      #PY = loaddll( hidemarudir + @"\hmPython3.dll" );
      
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      aaa = 1000
      bbb = "あいうえお"
      
      hm.Macro.Var['#aaa'] = aaa # 秀丸マクロに数値として伝達
      hm.Macro.Var['$bbb'] = bbb # 秀丸マクロに文字列として伝達
      
      
      )PY"
      );
      
      //------------------------------------------------------
      // ここではfreedllせずに継続しておいて、最後にfreedllしている
      // freedll( #PY );
      
      
      //------------------------------------------------------
      // ECMAScript6のV8エンジン(.NET有り)の部分
      //------------------------------------------------------
      #ES = loaddll( hidemarudir + @"\hmPy.dll" );
      
      #_ = dllfuncw( #ES, "DoString", R"ES(
      import clr
      import System
      
      aaa = hm.Macro.Var['#aaa'] # 秀丸マクロから受信
      bbb = hm.Macro.Var['$bbb'] # 秀丸マクロから受信
      
      clr.AddReferenceByPartialName("System.Windows.Forms")
      from System.Windows.Forms import *
      
      MessageBox.Show( str(aaa), bbb, MessageBoxButtons.YesNoCancel, MessageBoxIcon.Information );
      
      
      hm.Macro.Var['#aaa'] = aaa + 111;
      
      )ES"
      );
      
      freedll( #ES );
      
      
      //------------------------------------------------------
      // また、Pythonへと戻ってくる
      // loaddllせずに、そのまま利用するので、前のPythonの続き扱いとなる
      //------------------------------------------------------
      #_ = dllfuncw( #PY, "DoString", R"PY(
      
      from hmPython import *
      
      ccc = hm.Macro.Var['#aaa']  # 秀丸マクロから受信
      
      hm.debuginfo( aaa )
      hm.debuginfo( ccc )
      
      )PY"
      );
      
      //------------------------------------------------------
      // ここではfreedll
      freedll( #PY );
      
      

      ここでは紙面の都合上、全て1つのマクロファイルに埋め込んでいますが、
      通常は、Python用の.pyと、IronPython用の.pyでファイルを分け、関数を作成して、
      秀丸マクロからはそれらの関数を呼び出す、という形にするのが良いと思います。