"Ruby" (外部評価システム)
詳細
- Rubyバージョン2.0以降がサポートされる.
- Wolfram言語でRubyが使えるよう設定するためには,ワークフローの「ExternalEvaluate用にRubyを設定する」の手順に従うとよい.
ExternalEvaluateの使用法
- ExternalEvaluate["Ruby",code] はRuby REPLでコード列を実行し,Wolfram言語式として結果を返す.
- ExternalEvaluate["Ruby""String",code] はRuby REPLでコード列を実行し,Wolfram言語式として結果を返す.
- ExternalEvaluate["Ruby""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"に変換する.
例題
すべて開く すべて閉じる例 (3)
ExternalEvaluate["Ruby", "2+2"]ExternalEvaluate["Ruby", "[1,2,3,4]"]>とタイプしてドロップダウンメニューからRubyを選ぶと,評価にExternalEvaluateを使うコードのセルが得られる:
スコープ (27)
session = StartExternalSession["Ruby"]ExternalEvaluate[session, "true || false"]ExternalEvaluate[session, "\"hello\" + \" \" + \"world\""]ExternalEvaluate[session, "{\"one\"=>1, \"two\"=>2, \"three\"=>3}"]DeleteObject[session]セッションオプション (8)
"ReturnType" (3)
Ruby評価システムでは,デフォルトの戻り型は"Expression"である:
ExternalEvaluate["Ruby", "2+2"] === ExternalEvaluate["Ruby" -> "Expression", "2+2"]"Expression"戻り型では,数,文字列,リスト,連想は自動的にインポートされる:
ExternalEvaluate["Ruby", "[1, 2, 3]"]MatchQ[%, {__Integer}]"String"戻り型は,Rubyメソッドの to_s を呼び出すことによって結果の列を返す:
ExternalEvaluate["Ruby", "[1, 2, \"א\"]"]ExternalEvaluate["Ruby" -> "String", "[1, 2, \"א\"]"]ExternalEvaluate["Ruby", "([1, 2, \"א\"]).to_s"]"Evaluator" (1)
"SessionProlog" (1)
"SessionEpilog" (1)
"Prolog" (1)
コマンドオプション (10)
"Command" (3)
Rubyコードの列が与えられたときだけ,コマンドは直接実行される:
ExternalEvaluate["Ruby", "(1..5).to_a"]ExternalEvaluate["Ruby", <|"Command" -> "(1..5).to_a"|>]Fileラッパーを使ってファイルのコードを実行する:
file = Export[CreateFile[], "def add2(number)
number + 2
end", "Text"]ExternalEvaluate["Ruby", {
<|"Command" -> File[file]|>,
<|"Command" -> "add2(3)"|>
}]ExternalEvaluate["Ruby", {
File[file],
"add2(3)"
}]CloudObjectにコードを置く:
cloudObj = CloudExport["print('Hello World!')", "Text", CloudObject["hello-world-rb"]]ExternalEvaluate["Ruby", <|"Command" -> cloudObj|>];ExternalEvaluate["Ruby", cloudObj];"ReturnType" (1)
デフォルトでは,コマンドはセッションの生成中に指定される"ReturnType"を使って実行される:
ExternalEvaluate[
{"Ruby", "ReturnType" -> "String"},
"{'a'=> 2}"
]コマンドで"ReturnType"を指定すると,セッションの"ReturnType"が上書きされる:
ExternalEvaluate[
{"Ruby", "ReturnType" -> "String"},
{
<|"Command" -> "{'a'=> 2}"|>,
<|"Command" -> "{'a'=> 2}", "ReturnType" -> "Expression"|>
}
]"Arguments" (2)
"Arguments"を使って,引数付きのRuby関数を呼び出す:
ExternalEvaluate[
"Ruby",
<|"Command" -> "Proc.new {|x,y| x+y}", "Arguments" -> {2, 3}|>
]リスト以外の引数が与えられると,関数には単独の引数が渡される:
ExternalEvaluate[
"Ruby",
<|"Command" -> "Proc.new {|x| x+3}", "Arguments" -> 2|>
]第一引数としてリストを渡す必要がある場合は,追加のリストで明示的にそれをラップしなければならない:
ExternalEvaluate[
"Ruby",
{
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> 1|>,
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> {1}|>,
<|"Command" -> "Proc.new {|x| x}", "Arguments" -> {{1}}|>
}
]"Command"内で関数を定義し,"Arguments"で直接それを呼び出すことができる:
ExternalEvaluate[
"Ruby",
<|"Command" -> "lambda {|x, y| x+y}", "Arguments" -> {3, 5}|>
]Ruleを使っても同じ結果を得ることができる:
ExternalEvaluate[
"Ruby",
"lambda {|x, y| x+y}" -> {1, 3}
]ExternalFunctionを生成することによって引数を渡すこともできる:
session = StartExternalSession["Ruby"]function = ExternalFunction[session, "lambda {|x, y| x+y}"]function[1, 3]DeleteObject[session]"Constants" (1)
"TemplateArguments" (3)
コマンドを実行するとき,TemplateExpressionを行内に埋め込むことができる:
x = RandomReal[]
ExternalEvaluate["Ruby", "1 + <* x *>"]"TemplateArguments"を使うと明示的にTemplateSlotを埋めることができる:
ExternalEvaluate[
"Ruby",
<|"Command" -> "2 + ``", "TemplateArguments" -> 1|>
]リスト以外の引数が与えられると,テンプレートには単独のテンプレート引数が渡される:
ExternalEvaluate[
"Ruby",
<|"Command" -> "(``).to_s", "TemplateArguments" -> 5|>
]第一引数としてリストを渡す必要がある場合,それを明示的に追加のリストでラップしなければならない:
ExternalEvaluate[
"Ruby",
{
<|"Command" -> "(``).to_s", "TemplateArguments" -> 1|>,
<|"Command" -> "(``).to_s", "TemplateArguments" -> {2}|>,
<|"Command" -> "(``).to_s", "TemplateArguments" -> {{3}}|>
}
]テンプレートスロットに名前を付け,Associationを使うと,テンプレートに名前付きの引数を渡すことができる:
ExternalEvaluate[
"Ruby",
<|"Command" -> "(`start`.. `end`).to_a", "TemplateArguments" -> <|"start" -> 0, "end" -> 10|>|>
]外部操作 (8)
"Eval" (1)
Rubyにおける任意のコード評価を表すExternalOperationを実行する:
ExternalEvaluate["Ruby", ExternalOperation["Eval", "2+2"]]ExternalEvaluate["Ruby", ExternalOperation["Eval", "a + b", <|"a" -> 2, "b" -> 3|>]]"Call" (3)
Rubyで関数を作成するExternalOperationを定義する::
op = ExternalOperation["Eval", "Proc.new { |a, b| a + b }"]ExternalOperation "Call"を実行して関数を呼び出す:
call = ExternalOperation["Call", op, 1, 2]ExternalEvaluateを使って操作を実行する:
ExternalEvaluate["Ruby", call]"Call"操作のいずれの引数もExternalOperationにすることができる:
ExternalEvaluate["Ruby", ExternalOperation["Call", op, 1, ExternalOperation["Eval", "2+2"]]]以下のようにして,引数を直接ExternalEvaluateに渡すこともできる:
ExternalEvaluate["Ruby", op -> {1, 2}]ExternalEvaluate["Ruby", "f = Proc.new { |a, b| a + b }.call(1, 2)"]Ruby関数のExternalFunctionを作成する:
func = ExternalFunction["Ruby", "Proc.new { |a, b| a + b }"]ExternalEvaluate["Ruby", ExternalOperation["Call", func, 1, 2]]ExternalEvaluate["Ruby", func -> {1, 2}]Ruby関数のExternalObjectを作成する::
session = StartExternalSession["Ruby"]func = ExternalEvaluate[session, <|"Command" -> "Proc.new { |a, b| a + b }", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["Call", func, 1, 2]]ExternalEvaluate[session, func -> {1, 2}]ExternalObjectサブ値を使うこともできる:
func[ExternalOperation["Call", 1, 2]]DeleteObject[session]"GetAttribute" (2)
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}];Dateオブジェクトに対するExternalObjectを返す:
now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["GetAttribute", now, "year"]]ExternalEvaluate[session, "Date.new(2022, 10, 10).year"]DeleteObject[session]日付を表すExternalObjectを作成する:
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}]now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]ExternalOperationを使って現在の年を得る:
now[ExternalOperation["GetAttribute", "year"]]ほとんどの評価子では"GetAttribute"がデフォルト操作であり,ExternalOperationは省略できる:
now["year"]DeleteObject[session]"SetAttribute" (1)
session = StartExternalSession[{"Ruby", "SessionProlog" -> "require 'date'"}];date = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]ExternalEvaluate[session, ExternalOperation["SetAttribute", date, "year", 2024]]ExternalEvaluate[session, ExternalOperation["GetAttribute", date, "year"]]ExternalEvaluate[session, "d = Date.new(2022, 10, 10); d.instance_variable_set('@year', 2024)"]DeleteObject[session]"Cast" (1)
現在の日付を表すExternalObjectを作成する:
session = StartExternalSession["Ruby"];now = ExternalEvaluate[session, <|"Command" -> "Date.new(2022, 10, 10)", "ReturnType" -> "ExternalObject"|>]"Expression"を使ってオブジェクトをWolfram言語式として返す:
ExternalEvaluate[session, ExternalOperation["Cast", now, "Expression"]]Cast操作もExternalObjectサブ値で実行することができる:
now[ExternalOperation["Cast", "Expression"]]シンボルExpressionは同じことについてのショートカットである:
now[Expression]now[ExternalOperation["Cast", "String"]]シンボルStringは同じ操作の近道である:
now[String]オブジェクトをExternalObjectとして返す:
now[ExternalOperation["Cast", "ExternalObject"]]シンボルExternalObjectは同じ操作の近道である:
now[ExternalObject]ExternalEvaluateで"ReturnType"を使っても同じことができる:
ExternalEvaluate[session, <|"Command" -> now, "ReturnType" -> "String"|>]DeleteObject[session]アプリケーション (1)
カスタムのRuby関数を呼び出すWolfram言語関数を定義する:
session = StartExternalSession["Ruby"];evenTest = ExternalEvaluate[session, "def is_even(x)
if x%2 == 0
return true
else
return false
end
end
"]{#, evenTest[#]}& /@ Range[10]//TableFormDeleteObject[session]関連するガイド
関連するワークフロー
- ExternalEvaluate用にRubyを設定する
履歴
2020 で導入 (12.1)