"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)
ExternalEvaluate["NodeJS", "2+2"]ExternalEvaluate["NodeJS", "[1,2,3,4]"]Fileラッパーを使ってファイルに含まれるコードを実行する:
path = Export[CreateFile[], "[1, 2, 'hello']", "String"]ExternalEvaluate["NodeJS", File[path]]CloudDeployを使ってコードを配備し,CloudObjectから直接コードを実行する:
cobj = CloudExport["[1, 2, 'hello']", "String"]ExternalEvaluate["NodeJS", cobj]URLラッパーを使ってオンラインでホストされたコードを直接実行する:
functions = URL["https://exampledata.wolfram.com/script.js"]ExternalEvaluate["NodeJS", {functions, "cube(3)"}]スコープ (27)
session = StartExternalSession["NodeJS"]ExternalEvaluate[session, "true || false"]ExternalEvaluate[session, "'hello'+' '+'world'"]NodeJSでExternalFunctionを作成する:
incr = ExternalFunction[session, "x => x + 1"]incr[3]DeleteObject[session]セッションオプション (8)
"ReturnType" (3)
NodeJSでは,デフォルトの戻り型は"Expression"である:
ExternalEvaluate["NodeJS", "2+2"] === ExternalEvaluate["NodeJS" -> "Expression", "2+2"]"Expression"戻り型では,数,文字列,リスト,連想は自動的にインポートされる:
ExternalEvaluate["NodeJS", "[2, 3]"]"String"戻り型はJSONを使って文字列を返す:
ExternalEvaluate["NodeJS" -> "String", "[1, 2, 'א']"]StringQ[%]"Evaluator" (1)
"SessionProlog" (1)
"SessionEpilog" (1)
"Prolog" (1)
コマンドオプション (10)
"Command" (4)
ExternalEvaluate["NodeJS", "[1, 2, 3]"]ExternalEvaluate["NodeJS", <|"Command" -> "[1, 2, 3]"|>]Fileラッパーを使ってファイルからコードを実行する:
ExternalEvaluate["NodeJS", {
<|"Command" -> File["ExampleData/powers.js"]|>,
<|"Command" -> "square(3)"|>,
<|"Command" -> "cube(3)"|>
}]ExternalEvaluate["NodeJS", {
File["ExampleData/powers.js"],
"square(3)",
"cube(3)"
}]URLラッパーを使って,オンラインでホストされるコードを直接実行する:
ExternalEvaluate["NodeJS", {
<|"Command" -> URL["https://exampledata.wolfram.com/script.js"]|>,
<|"Command" -> "cube(3)"|>
}]ExternalEvaluate["NodeJS", {
URL["https://exampledata.wolfram.com/script.js"],
"cube(3)"
}]CloudObjectにコードを置く:
cloudObj = CloudExport["console.log('Hello World!')", "Text", CloudObject["hello-world-js"]]ExternalEvaluate["NodeJS", <|"Command" -> cloudObj|>]ExternalEvaluate["NodeJS", cloudObj]"ReturnType" (1)
"Arguments" (2)
ExternalEvaluate[
"NodeJS",
<|"Command" -> "(a, b) => a + b", "Arguments" -> {1, 2}|>
]ExternalEvaluate[
"NodeJS",
<|"Command" -> "a => a", "Arguments" -> 1|>
]第一引数としてリストを渡す必要がある場合は,追加のリストで明示的にそれをラップする:
ExternalEvaluate[
"NodeJS",
{
<|"Command" -> "a => a", "Arguments" -> 1|>,
<|"Command" -> "a => a", "Arguments" -> {1}|>,
<|"Command" -> "a => a", "Arguments" -> {{1}}|>
}
]"Command"の関数に名前を付け,"Arguments"で直接それを呼び出すことができる:
ExternalEvaluate[
"NodeJS",
<|"Command" -> "parseInt", "Arguments" -> "123"|>
]Ruleを使っても同じ結果を得ることができる:
ExternalEvaluate[
"NodeJS",
"parseInt" -> "123"
]別の方法としてExternalFunctionを定義するというものがある:
session = StartExternalSession["NodeJS"]function = ExternalFunction[session, "parseInt"]function["123"]DeleteObject[session]"Constants" (1)
"TemplateArguments" (2)
コマンドを実行するとき,TemplateExpressionを行内に埋め込むことができる:
x = RandomReal[]
ExternalEvaluate["NodeJS", "1 + <* x *>"]"TemplateArguments"を使ってTemplateSlotを明示的に埋めることができる:
ExternalEvaluate[
"NodeJS",
<|"Command" -> "2 + ``", "TemplateArguments" -> 1|>
]第一引数としてリストを渡す必要がある場合,それを明示的に追加のリストでラップする:
ExternalEvaluate[
"NodeJS",
{
<|"Command" -> "JSON.stringify(``)", "TemplateArguments" -> 1|>,
<|"Command" -> "JSON.stringify(``)", "TemplateArguments" -> {1}|>,
<|"Command" -> "JSON.stringify(``)", "TemplateArguments" -> {{1, 2}}|>
}
]テンプレートスロットに名前を付け,Associationを使うと,テンプレートに名前付きの引数を渡すことができる:
ExternalEvaluate[
"Python",
<|"Command" -> "(`x` - `y` + `z`)", "TemplateArguments" -> <|"x" -> 10, "y" -> 3, "z" -> 2|>|>
]External Operations (8)
"Eval" (1)
NodeJSにおける任意のコード評価を表すExternalOperationを実行する:
ExternalEvaluate["NodeJS", ExternalOperation["Eval", "2+2"]]ExternalEvaluate["NodeJS", ExternalOperation["Eval", "a + b", <|"a" -> 2, "b" -> 3|>]]"Call" (3)
NodeJSで関数を作成するExternalOperationを定義する:
op = ExternalOperation["Eval", "Math.max"]ExternalOperation "Call"を実行することによる関数呼出しを定義する:
call = ExternalOperation["Call", op, 1, 2]ExternalEvaluateを使って操作を実行する:
ExternalEvaluate["NodeJS", call]"Call"操作のいずれの引数もExternalOperationにすることができる:
ExternalEvaluate["NodeJS", ExternalOperation["Call", op, 1, ExternalOperation["Eval", "2+2"]]]以下のようにして,引数を直接ExternalEvaluateに渡すこともできる:
ExternalEvaluate["NodeJS", op -> {1, 2}]結果は,以下のNodeJSコードを実行したときと同じになる:
ExternalEvaluate["NodeJS", "Math.max(1, 2)"]NodeJS関数maxのExternalFunctionを作成する:
max = ExternalFunction["NodeJS", "Math.max"]ExternalEvaluate["NodeJS", ExternalOperation["Call", max, 1, 2]]The same result can be achieved by doing the following:
ExternalEvaluate["NodeJS", max -> {1, 2}]NodeJS関数のExternalFunctionを作成する:
session = StartExternalSession["NodeJS"]max = ExternalEvaluate[session, <|"Command" -> "Math.max", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["Call", max, 1, 2]]ExternalEvaluate[session, max -> {1, 2}]ExternalObjectサブ値を使うこともできる:
ExternalObject[max][ExternalOperation["Call", 1, 2]]DeleteObject[session]"GetAttribute" (2)
session = StartExternalSession["NodeJS"];"Math"オブジェクトのExternalObjectを返す:
math = ExternalEvaluate[session, <|"Command" -> "Math", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["GetAttribute", math, "max"]]ExternalEvaluate[session, ExternalOperation["GetAttribute", math, "max"] -> {1, 2}]ExternalEvaluate[session, "Math.max(1, 2)"]DeleteObject[session]"Math"オブジェクトを表すExternalObjectを作成する:
session = StartExternalSession["NodeJS"]math = ExternalEvaluate[session, <|"Command" -> "Math", "ReturnType" -> "ExternalObject"|>]ExternalOperationを使って関数を得る:
math[ExternalOperation["GetAttribute", "max"]]ほとんどの評価子では"GetAttribute"がデフォルト操作であり,ExternalOperationは省略できる:
math["max"]"Call"操作を実行することで直接関数を呼び出すことができる:
math["max", ExternalOperation["Call", 1, 2]]math["max" -> {1, 2}]DeleteObject[session]"SetAttribute" (1)
session = StartExternalSession["NodeJS"];NodeJSでオブジェクトを作成する.単独のオブジェクトを作成するときは,カッコで囲まなければならない:
obj = ExternalEvaluate[session, <|"Command" -> "({})", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["SetAttribute", obj, "b", 6]]ExternalEvaluate[session, ExternalOperation["GetAttribute", obj, "b"]]ExternalEvaluate[session, "obj = {}; obj.b = 6"]DeleteObject[session]"Cast" (1)
配列を表すExternalObjectを作成する:
session = StartExternalSession["NodeJS"];now = ExternalEvaluate[session, <|"Command" -> "[1, 2, 3]", "ReturnType" -> "ExternalObject"|>]"Expression"を使ってオブジェクトをWolfram言語式として返す:
ExternalEvaluate[session, ExternalOperation["Cast", now, "Expression"]]Cast操作もExternalObjectサブ値で実行することができる:
now[ExternalOperation["Cast", "Expression"]]シンボルExpressionは同じことについてのショートカットである:
now[Expression]now[ExternalOperation["Cast", "String"]]The symbol String is a shortcut for the same:
now[String]オブジェクトをExternalObjectとして返す:
now[ExternalOperation["Cast", "ExternalObject"]]シンボルExternalObjectは同じ操作の近道である:
now[ExternalObject]ExternalEvaluateで"ReturnType"を使っても同じことができる:
ExternalEvaluate[session, <|"Command" -> now, "ReturnType" -> "String"|>]DeleteObject[session]アプリケーション (2)
NodeJSでRange関数を定義する:
range[n1_, n2_, step_ : 1] :=
ExternalEvaluate["NodeJS", <|
"Command" -> "(n1, n2, step=1) => {
if (! n2 && ! n2 == 0) {
return range(0,n1-1,step)
}
const arr=[];
for (let i=n1;i<=n2;i+=step) {
arr.push(i)
}
return arr
}",
"Arguments" -> {n1, n2, step}
|>]range[1, 10]prettier を使って,JavaScriptコードの文字列を再フォーマットする:
reformatJavascriptCode[code_] :=
Last @ ExternalEvaluate["NodeJS", {
"const prettier = require('prettier')",
<|
"Command" -> "prettier.format",
"Arguments" -> code
|>
}]reformatJavascriptCode["foo(reallyLongArg(), omgSoManyParameters(), IShouldRefactorThis(), isThereSeriouslyAnotherOne());"]関連するガイド
関連するワークフロー
- ExternalEvaluate用にNodeJSを設定する
履歴
2018 で導入 (11.3)