|
| 1 | +--- |
| 2 | +title: ".NET Interactive の C# と F# で値渡しをしたい! (Jupyter Notebook)" |
| 3 | +tags: |
| 4 | + - 'c#' |
| 5 | + - 'f#' |
| 6 | + - '.NET' |
| 7 | + - 'Jupyter' |
| 8 | + - 'interactive' |
| 9 | +private: false |
| 10 | +updated_at: '' |
| 11 | +id: null |
| 12 | +organization_url_name: null |
| 13 | +slide: false |
| 14 | +ignorePublish: false |
| 15 | +--- |
| 16 | + |
| 17 | +## .NET Interactive の C# と F# で値渡しをしたい! |
| 18 | + |
| 19 | +タイトル通りですが、Jupyter Notebook + .NET Interactive で、C# と F# の間で値渡しをします。 |
| 20 | + |
| 21 | +試していませんが、多分 PowerShell でも値渡しできると思います。JavaScript、Python などその他はわかりません。 |
| 22 | + |
| 23 | +資料のサンプルは、C# の `number` を F# 側で利用するように書いていますが、その逆も可能です。 |
| 24 | + |
| 25 | +### そのまま値渡しできないのか試してみる |
| 26 | + |
| 27 | +同じカーネルを利用しているはずなので、同じ変数だったら利用できるのではないかと思って試してみました。 |
| 28 | + |
| 29 | + |
| 30 | + |
| 31 | +はい、だめみたいです。 |
| 32 | + |
| 33 | +言語が変わると、流石に値渡しが必要になるようですね。 |
| 34 | + |
| 35 | +### ちゃんと値渡しする |
| 36 | + |
| 37 | +検索したり、AI に聞いたりしても[^ai]なかなか出なかったのですが、[.NET Interactive の公式資料](https://github.com/dotnet/interactive/blob/79bcf1f70c097a242e4b0baaf0ec32169a46733e/docs/variable-sharing.md)内に答えがありました。 |
| 38 | + |
| 39 | +[^ai]: 存在しない `Kernel.GetValueAsync()` を利用しろと言われ続けました |
| 40 | + |
| 41 | +ズバリこれです: |
| 42 | + |
| 43 | +```sh |
| 44 | +#!set --value @<言語>:<元の変数名> --name <対象の変数名> |
| 45 | +``` |
| 46 | +こちらのコードを、受け取り側の言語に入れます。 |
| 47 | + |
| 48 | +今回の場合は、 |
| 49 | +```sh |
| 50 | +#!set --value @csharp:text --name text |
| 51 | +``` |
| 52 | +となります。 |
| 53 | + |
| 54 | + |
| 55 | + |
| 56 | +簡単で便利ですね。 |
| 57 | + |
| 58 | +### おまけ: 元から共通の値を設定する |
| 59 | + |
| 60 | +直接、共通の値を設定することもできます。 |
| 61 | + |
| 62 | +```sh |
| 63 | +#!set --name <変数名> --value <値> |
| 64 | +``` |
| 65 | + |
| 66 | +例: |
| 67 | +```sh |
| 68 | +#!set --name imagePath --value httpss://example.com |
| 69 | +``` |
| 70 | + |
| 71 | +文字列にスペースを含めるときは、`""`で囲います: |
| 72 | +```sh |
| 73 | +#!set --name fruits --value "Apple Lemon Banana" |
| 74 | +``` |
| 75 | + |
| 76 | +### おまけ: ユーザーの入力から設定する |
| 77 | + |
| 78 | +Jupyter Notebook では、ユーザーからの入力を受け付けることができます。 |
| 79 | + |
| 80 | +それを利用して、共通の値を設定することもできるようです。 |
| 81 | + |
| 82 | +```sh |
| 83 | +#!set --name <変数> --value @input:<メッセージ> |
| 84 | +``` |
| 85 | + |
| 86 | +例: |
| 87 | +```sh |
| 88 | +#!set --name url --value @input:"URL を入力してください。" |
| 89 | +``` |
| 90 | + |
| 91 | +`@input:` の代わりに `@password` なども使えます。 |
| 92 | + |
| 93 | +## 最後に |
| 94 | + |
| 95 | +基本は F# で処理していて、C# でしか使えないライブラリを使用したいときや、その逆の場合は、このように簡単に値渡しができて便利ですね! |
| 96 | + |
| 97 | +私の場合は、`Microsoft.Maui.Graphics` が F# 未対応 (多分) だったので、グラフィック部分だけ C# で処理し、ファイルの処理や描画処理を F# にしてみました。(まあ、やろうと思ったら C# で全部書けるので、ロマン仕様になってしまっていますが) |
| 98 | + |
| 99 | +F# は言語としては凄そう (小並感) ですが、ライブラリがやや少ないのが弱点な気がするので、この値渡し (相互運用) などで、その弱点が補えるといいですね。 |
| 100 | + |
| 101 | +### 参考 |
| 102 | + |
| 103 | +- [.NET Interactive/docs/variable sharing - GitHub](https://github.com/dotnet/interactive/blob/79bcf1f70c097a242e4b0baaf0ec32169a46733e/docs/variable-sharing.md) |
0 commit comments