"NodeJS" (外部評価システム)

詳細

  • Node.jsのバージョン7.10.1以降がサポートされる.
  • Node.jsは,ChromeのV8 JavaScriptエンジン上に構築されたJavaScriptランタイムである.
  • Wolfram言語でNode.jsが使えるよう設定するためには,ワークフローの「ExternalEvaluate用にNodeJSを設定する」の手順に従うとよい.

ExternalEvaluateの使用法

  • ExternalEvaluate["NodeJS",code] はNode.js REPLでコード列を実行し,Wolfram言語式として結果を返す.
  • ExternalEvaluate["NodeJS""String",code] はNode.js REPLでコード列を実行し,結果を解釈しない.
  • ExternalEvaluate["NodeJS""type",code]"type"として可能な設定:
  • "Expression"Wolfram言語式に変換しようと試みる
    "String"外部評価子によって出力された生の文字列を与える
    "ExternalObject"結果をExternalObjectとして返す

データ型

サポートされる外部操作

  • ExternalOperation["Eval","code"]"code"の外部評価を表す.
  • ExternalOperation["Eval","code",assoc]はパラメータが assoc で与えられた"code"の外部評価を表す.
  • ExternalOperation["Call",func,arg1,arg2,]は与えられた引数が arg1, arg2, の関数func を呼び出す.
  • ExternalOperation["GetAttribute",obj,"attr"]obj の属性"attr"を得る.
  • ExternalOperation["SetAttribute",obj,"attr",val]obj の属性"attr"を与えられた値 val に設定する.
  • ExternalOperation["Cast",obj,"type"]obj を指定された"type"に変換する.

例題

すべて開くすべて閉じる

  (2)

Fileラッパーを使ってファイルに含まれるコードを実行する:

CloudDeployを使ってコードを配備し,CloudObjectから直接コードを実行する:

URLラッパーを使ってオンラインでホストされたコードを直接実行する:

スコープ  (28)

セッションを開始する:

NodeJSでブール文を評価し,それを返す:

NodeJSで文字列を連結して,結果を返す:

NodeJSでExternalFunctionを作成する:

関数を呼び出す:

セッションを終了する:

セッションオプション  (9)

"ReturnType"  (3)

NodeJSでは,デフォルトの戻り型は"Expression"である:

"Expression"戻り型では,数,文字列,リスト,連想は自動的にインポートされる:

"String"戻り型はJSONを使って文字列を返す:

"Version"  (1)

"Version"を使うと,特定のバージョンの評価子だけを確実に使うことができる:

マイナーバージョンやパッチバージョンを指定することができる:

"Evaluator"  (1)

指定された"Evaluator"を使ってコードを評価する:

"SessionProlog"  (1)

"SessionProlog"を使って,セッションの初めに副作用を実行する:

"SessionEpilog"  (1)

"SessionEpilog"を使って,セッションの最後に副作用を実行する:

"Prolog"  (1)

"Prolog"を使って,それぞれの評価の前に副作用を実行する:

"Epilog"  (1)

"Epilog"を使ってそれぞれの評価の後に副作用を実行する:

コマンドオプション  (10)

"Command"  (4)

文字列が与えられるとコマンドは直接実行される:

上記は次の形式を使ったコマンドに等しい:

Fileラッパーを使ってファイルからコードを実行する:

上記は次の形式を使ったコマンドに等しい:

URLラッパーを使って,オンラインでホストされるコードを直接実行する:

上記は次の形式を使ったコマンドに等しい:

CloudObjectにコードを置く:

クラウドから直接評価する:

上記は次の形式を使ったコマンドに等しい:

"ReturnType"  (1)

コマンドで"ReturnType"を指定すると,セッションの"ReturnType"が上書きされる:

"Arguments"  (2)

"Arguments"を使って引数でコマンドを呼び出す:

引数が1個の場合はリストを使う必要はない:

第一引数としてリストを渡す必要がある場合は,追加のリストで明示的にそれをラップする:

"Command"の関数に名前を付け,"Arguments"で直接それを呼び出すことができる:

Ruleを使っても同じ結果を得ることができる:

別の方法としてExternalFunctionを定義するというものがある:

"Constants"  (1)

"Constants"を使って,コマンドを実行する前に大域的変数を設定する:

"TemplateArguments"  (2)

コマンドを実行するとき,TemplateExpressionを行内に埋め込むことができる:

"TemplateArguments"を使ってTemplateSlotを明示的に埋めることができる:

第一引数としてリストを渡す必要がある場合,それを明示的に追加のリストでラップする:

テンプレートスロットに名前を付け,Associationを使うと,テンプレートに名前付きの引数を渡すことができる:

External Operations  (8)

"Eval"  (1)

NodeJSにおける任意のコード評価を表すExternalOperationを実行する:

第2引数を使って評価のコンテキストを渡す:

"Call"  (3)

NodeJSで関数を作成するExternalOperationを定義する:

ExternalOperation "Call"を実行することによる関数呼出しを定義する:

ExternalEvaluateを使って操作を実行する:

"Call"操作のいずれの引数もExternalOperationにすることができる:

以下のようにして,引数を直接ExternalEvaluateに渡すこともできる:

結果は,以下のNodeJSコードを実行したときと同じになる:

NodeJS関数maxのExternalFunctionを作成する:

"Call"操作を実行することで関数を呼び出す:

The same result can be achieved by doing the following:

NodeJS関数のExternalFunctionを作成する:

"Call"操作を実行することで関数を呼び出す:

以下のようにしても同じ結果が得られる:

ExternalObjectサブ値を使うこともできる:

セッションを削除する:

"GetAttribute"  (2)

日付を扱うNodeJSセッションを開始する:

"Math"オブジェクトのExternalObjectを返す:

"GetAttribute"を使って関数を抽出する:

関数を呼び出す:

結果は以下のNodeJSコードを実行したときと同じである:

セッションを削除する:

"Math"オブジェクトを表すExternalObjectを作成する:

ExternalOperationを使って関数を得る:

ほとんどの評価子では"GetAttribute"がデフォルト操作であり,ExternalOperationは省略できる:

"Call"操作を実行することで直接関数を呼び出すことができる:

関数の呼出しは以下でも可能である:

セッションを削除する:

"SetAttribute"  (1)

オブジェクトを操作するNodeJSセッションを開始する:

NodeJSでオブジェクトを作成する.単独のオブジェクトを作成するときは,カッコで囲まなければならない:

属性"b"を6に設定する:

属性が6に設定されたことをチェックする:

結果は以下のNodeJSコードを実行したときと同じである:

セッションを削除する:

"Cast"  (1)

配列を表すExternalObjectを作成する:

"Expression"を使ってオブジェクトをWolfram言語式として返す:

Cast操作もExternalObjectサブ値で実行することができる:

シンボルExpressionは同じことについてのショートカットである:

オブジェクトを文字列として返す:

The symbol String is a shortcut for the same:

オブジェクトをExternalObjectとして返す:

シンボルExternalObjectは同じ操作の近道である:

ExternalEvaluate"ReturnType"を使っても同じことができる:

セッションを削除する:

アプリケーション  (2)

NodeJSでRange関数を定義する:

関数を使う:

prettierを使って,JavaScriptコードの文字列を再フォーマットする:

考えられる問題  (1)

オブジェクトを直接返すコマンドを実行すると,シンタックスエラーが戻る:

オブジェクトを戻すためには,丸カッコを加えなければならない: